20.1 语法
JSON的语法可以表示一下三种类型的值。
简单值:与JavaScript相同,可以表示字符串,数值,布尔值和null,但不支持特殊值undefined。
对象:无需键值对。
数组:有序值的列表。
JSON不支持变量,函数或对象实例,仅是一种表示结构化数据的格式。
20.1.1 简单值
JSON表示字符串时必须用双引号,单引号会导致语法错误。其他简单值表示与JavaScript相同。
20.1.2 对象和数组
JSON中对象的属性名称要加双引号。JSON对象没有声明变量,没有末尾分号,同一个对象不能出现两个同名属性。JSON数组的语法与JavaScript相同,但同样也没有变量和分号。
20.2 解析与序列化
20.2.1 序列化
JSON对象的stringify()方法用于将JavaScript对象序列化为JSON字符串。默认情况下,输出的JSON字符串不包含任何空格字符或缩进。所有函数及原型都会被有意忽略,值为undefined的任何属性也都会被跳过。
var obj = {
x:"a",
y:"b",
z:{
z1:[1,2,3],
z2:"z2"
},
u:undefined,
f:function () {
return this.x;
}
};
console.log(JSON.stringify(obj)); // {"x":"a","y":"b","z":{"z1":[1,2,3],"z2":"z2"}}
JSON.stringify()方法第二个参数可以是一个数组或方法,为数组时,序列化的结果将只包含数组中列出的属性。
console.log(JSON.stringify(obj,["x","y"])); // {"x":"a","y":"b"}
第二个参数为方法时,接收两个参数,一个是属性名,一个是属性值,可以在方法中对属性进行操作,根据函数的返回值改变序列化的结果。返回值为undefined的项会被忽略。
console.log(JSON.stringify(obj,function (key, value) {
console.log(value);
return value;
}));
JSON.stringify()方法第三个参数是用于控制缩进和空白符,如果这个参数是一个数值,则表示每个级别缩进的空格数。缩进值最大为10。
console.log(JSON.stringify(obj,null,4));
/*
{
"x": "a",
"y": "b",
"z": {
"z1": [
1,
2,
3
],
"z2": "z2"
}
}
*/
当缩进参数为一个字符串时,将用这个字符串来当做缩进符。
console.log(JSON.stringify(obj,null,"----"));
/*
{
----"x": "a",
----"y": "b",
----"z": {
--------"z1": [
------------1,
------------2,
------------3
--------],
--------"z2": "z2"
----}
}
*/
当对象上有toJSON()方法时,在序列化的时候会执行toJSON()方法来返回序列化结果。
var obj = {
x:"a",
y:"b",
z:{
z1:[1,2,3],
z2:"z2"
},
u:undefined,
f:function () {
return this.x;
},
toJSON:function () {
return 0;
}
};
console.log(JSON.stringify(obj)); // 0
20.2.2 解析
JSON.parse()方法用于将JSON字符串解析为JavaScript对象。同样接收一个用于操作解析的方法作为参数。与序列化方法的第二个参数相同,这个解析方法接收两个参数一个是属性名,一个是属性值,可以在方法内对每一项进行操作,根据返回值改变解析的结果。
var obj = {
x:"a",
y:"b",
z:{
z1:[1,2,3],
z2:"z2"
},
u:undefined,
f:function () {
return this.x;
}
};
var jsonObj = JSON.stringify(obj);
console.log(JSON.parse(jsonObj,function (key, value) {
if(key==="x"){
value +=1;
}
return value;
})); // {x: "a1", y: "b", z: {…}}
网友评论