注意区分:JSON字符串和Javascript对象字面量
2016-05-03 14:36
274 查看
JSON是基于Javascript语法的一个子集而创建的,特别是对象和数组字面量语法。
正是由于JSON的这种特殊来历,导致很多Javascript程序员往往会混淆Javascript对象字面量和JSON。
Javascript代码则必须需符合其语言规范,不能在其他语言中直接使用。
然而,我们不能把上面的代码叫做JSON,因为它出现在Javascript源文件中,是Javascript代码,不是纯文本。只能把它叫做Javascript对象字面量。
我们把包围属性名的双引号去掉了,仍然是合法有效的Javscript对象字面量代码,但已经不是合法的JSON文本了,因为JSON要求所有的属性必须加双引号。
不单单是引号的问题,Javascript中还有很多数据类型也是JSON不支持的,如函数:
上面是非常常见的合法的对象字面量,然而却不是合法的JSON,因为JSON还不支持函数这种数据类型。
上述代码运行时会产生错误,因为eval会把{}当成是没有名字的Javascript语句。
解决办法是,加上小括号:
此时,小括号内部先运算得到一个空对象,然后返回。
对于JSON字符串,通用的解析方法为:
在ECMAScript3.1标准中,已经提供了一个名为JSON的全局对象,专门用来解析和反解析JSON字符串。
与eval完全不同,JSON.parse()方法,把参数当成是JSON字符串文本,而不是Javascript代码,所以只要是合法的JSON字符串就可以。
正是由于JSON的这种特殊来历,导致很多Javascript程序员往往会混淆Javascript对象字面量和JSON。
1 JSON是纯文本,不是Javascript代码
JSON是作为XML的替代品而出现的,它本身是一种跨平台的数据表示标准,是纯文本字符串,不局限于任何编程语言。Javascript代码则必须需符合其语言规范,不能在其他语言中直接使用。
2 JSON文本是Javascript语言中的合法源代码
然而由于JSON本身选用了Javascript的语法子集,导致了JSON字符串本身就是合法的Javascript源代码片段。var person = // 下面的Javascript代码正好符合JSON { "name": "SMSTONG", "title": "DBA“, "age": 18 }
然而,我们不能把上面的代码叫做JSON,因为它出现在Javascript源文件中,是Javascript代码,不是纯文本。只能把它叫做Javascript对象字面量。
3 Javacript字面量代码不一定是合法的JSON文本
所有的JSON文本都是合法的Javascript源代码片段,但是反过来去不成立。因为JSON只是Javascript的一个子集而已,Javascript还有很多的部分是不符合JSON规范的。例如:var person = // 下面的Javascript代码不符合JSON { name: "SMSTONG", title: "DBA“, age: 18 }
我们把包围属性名的双引号去掉了,仍然是合法有效的Javscript对象字面量代码,但已经不是合法的JSON文本了,因为JSON要求所有的属性必须加双引号。
不单单是引号的问题,Javascript中还有很多数据类型也是JSON不支持的,如函数:
var person = { "name":"SMSTONG", "fight": function(){ alert('fighting the enemy!'); } }
上面是非常常见的合法的对象字面量,然而却不是合法的JSON,因为JSON还不支持函数这种数据类型。
4 eval()的参数是Javascript源代码片段,而不是JSON字符串
eval(str)函数本质上是把str作为Javascript代码来执行的,例如:var obj = eval("{}");
上述代码运行时会产生错误,因为eval会把{}当成是没有名字的Javascript语句。
解决办法是,加上小括号:
var obj = eval("({})");
此时,小括号内部先运算得到一个空对象,然后返回。
对于JSON字符串,通用的解析方法为:
var obj = eval("(" + jsonText + ")");
在ECMAScript3.1标准中,已经提供了一个名为JSON的全局对象,专门用来解析和反解析JSON字符串。
var obj = JSON.parse("{}");
与eval完全不同,JSON.parse()方法,把参数当成是JSON字符串文本,而不是Javascript代码,所以只要是合法的JSON字符串就可以。
相关文章推荐
- JSON判断是否有此属性(key)键值
- 两排滚动js
- split一些简单的分隔(js)
- 聊一聊JavaScript作用域和作用域链
- prefixfree.min.js插件的了解
- js解决列表中按钮重复点击重复提交的问题
- 小白谈谈对JS原型链的理解
- angular.js[2]
- JavaScript js闭包所用的场合以及优缺点
- 使用json协议传输二进制文件
- 解决js输出汉字乱码问题
- extjs 遍历树 根据子节点修改父节点图标
- 原生JS封装Ajax插件(同域&&jsonp跨域)
- jsp实现单刷时间显示,刷新显示时间不刷新页面
- 简单粗暴地理解js原型链--js面向对象编程
- 手机中的js事件
- js所有函数集合
- jsp
- C# litJson 使用方法
- JavaScript 模块插件程序之返回顶部插件