JSON是基于Javascript语法的一个子集而创建的,特别是对象和数组字面量语法。
正是由于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字符串就可以。