注意区分:JSON字符串和Javascript对象字面量

时间:2022-02-18 14:43:05

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字符串就可以。