1 什么是JSON
JSON(JavaScript Object Notation)是一种用于数据交换的文本格式,目的是取代繁琐笨重的XML格式。JSON格式提出后,被迅速接受,并成为各大网站交换数据的标准格式。
JSON格式有两个显著优点:
- 书写简单,一目了然;
- 符合JavaScript原生语法,由解释引擎直接处理,无需额外解析代码。
每个JSON对象就是一个值,可以是一个原始类型的值,也可以是数组或对象。它有以下规定。
- 复合类型的值只能是数组或对象,不能是函数、正则表达式对象、日期对象。
- 原始类型的值只有四种:字符串、数值(必须以十进制表示)、布尔值和
null
(不能使用NaN
、undefined
)。- 字符串必须使用双引号表示,不能使用单引号。
- 对象的键名必须放在双引号里面。
- 数组或对象的最后一个成员后面,不能加逗号。
以下都是合法的JSON。
[ "one", "two", "three"]
{ "name": null }
{ "name": "小张", "age": 20 }
{ "name": ["小张", "小李"]}
以下都是不合法的JSON。
{ name: "小张", 'age': 20 } // 属性名必须使用双引号
{ "name": "小张", "getName": function() {
return this.name;
}
} // 属性值不能使用函数
注意,null
、空数组和空对象都是合法的JSON值。
2 JSON对象
JSON对象是JavaScript的原生对象,有两个静态方法:JSON.stringify()
和JSON.parse()
。
3 JSON.stringify()
3.1 基本用法
JSON.stringify()
用于将一个值转化JSON字符串。该字符串将符合JSON格式,并且可以被JSON.parse
方法还原。
JSON.stringify('abc') // ""abc""
JSON.stringify([]) // "[]"
JSON.stringify({name:"小张"}) // '{"name":"小张"}'
上面代码将各种类型的值,转成JSON字符串。
如果对象的属性是undefined
、函数或XML对象,该属性会被JSON.stringify
过滤。
var obj = {
a: undefined,
b: function() {}
};
JSON.stringify(obj) // "{}"
3.2 参数对象的toJSON方法
如果参数对象有自定义的toJSON
方法,那么JSON.stringify
会使用这个方法的返回值作为参数,而忽略该对象的其它属性。
先看一个普通对象。
var user = {
firstName: '三',
lastName: '张',
get fullName() {
return this.lastName + this.firstName;
}
};
JSON.stringify(user)
// "{"firstName":"三","lastName":"张","fullName":"张三"}"
现在,为这个对象加上toJSON
方法。
var user = {
firstName: '三',
lastName: '张',
get fullName() {
return this.lastName + this.firstName;
}
toJSON: function() {
return {
name: this.lastName + this.firstName
};
}
};
JSON.stringify(user)
// "{"name":"张三"}"
上面代码中,JSON.stringify
发现参数对象有toJSON
方法,就直接使用这个方法的返回值作为参数了。
JSON.stringify
默认不能转换正则对象,但是通过 toJSON
方法就可以转换了。
var obj = {
reg: /foo/
};
// 不设置 toJSON 方法时
JSON.stringify(obj) // "{"reg":{}}"
// 设置 toJSON 方法时
RegExp.prototype.toJSON = RegExp.prototype.toString;
JSON.stringify(/foo/) // ""/foo/""
4 JSON.parse()
JSON.parse
方法用于将JSON字符串转换成对应的值。
JSON.parse('{}') // {}
JSON.parse('true') // true
var obj = JSON.parse('{"name": "张三"}');
obj.name // 张三
如果传入字符串不是有效的JSON格式,将会报错。
JSON.parse("'String'") // illegal single quotes
// SyntaxError: Unexpected token ILLEGAL
上面代码中,因为单引号字符串不符合JSON格式,所以报错。
为了处理解析错误,可以将JSON.parse
方法放在try...catch
代码块中。
try {
JSON.parse("'String'");
} catch(e) {
console.log('parsing error');
}
注:本文适用于ES5规范,原始内容来自 JavaScript 教程,有修改。