JSON
JSON(JavaScript Object Notation, JS对象标记)是一种数据格式,不是一种编程语言。JSON和JavaScript对象区别,就像“斑马线”和“斑马”,“斑马线”基于“斑马”身上的条纹来呈现和命名,但是“斑马”和“斑马线”是两种东西。不要混淆!
一、语法
JSON的语法可以表示三种类型的值:
(1)简单值:可以在JSON中表示字符串(必须使用双引号)、数值、布尔值和null;但不支持JavaScript中的特殊值undefined。
(2)对象:对象的属性必须加双引号。
{
"name": "liang",
"age": 26,
"married": false,
"address": null
}
(3)数组:[“ligang”, 25, false, null]
二、解析和序列化
早期JSON解析器基本上就是使用JavaScript的eval()函数;其存在一定的风险,可能执行一些恶意代码。
对于不能原生支持JSON解析的浏览器,github上提供了比较优秀的shim方法:JSON-js
JSON.stringfy(“JavaScript对象”, “过滤器”, “是否缩进”):把一个JavaScript对象序列化为一个JSON字符串;值为undefined的属性会被跳过。
示例:undefined会被忽略
var person = {
name: "liang",
age: 26,
address: undefined
}
JSON.stringify(person); // "{"name":"liang","age":26}"
示例:过滤结果
var ary = [
{name: "ligang", age: 26, sex: "male"},
{name: "camile", age: 26, sex: "female"}
];
(1)第二个参数是一个数组,返回只包含name和age
JSON.stringify(ary, ["name", "age"]);
// 结果:"[{"name":"ligang","age":26},{"name":"camile","age":26}]"
(2)第二个参数是一个函数
JSON.stringify(ary, function(key, value) {
switch(key) {
case "name":
return value;
case "age":
return undefined;
case "sex":
return value === "male" ? "男" : "女";
default:
return value;
}
});
// 结果:"[{"name":"ligang","sex":"男"},{"name":"camile","sex":"女"}]"
注意:如果函数返回了undefined,那么相应的属性会被忽略
(3)第三个参数控制结果中的缩进和空白符。
如果是一个数值,那他表示的是每个级别缩进的空格数;最大缩进空格数为10,大于10的自动转化为10。
如果是非数值,则这个字符将在JSON字符串中被用作缩进符(不再使用空格)。
var person = {
name: "ligang",
address: {
province: "shandong",
city: "yantai"
}
};
JSON.stringify(person, null, 4);
// 结果:
{
"name": "ligang",
"address": {
"province": "shandong",
"city": "yantai"
}
}"
(4)toJSON()方法,自定义序列化需求
var person = {
name: "ligang",
age: 26,
toJSON: function() {
return this.name + "|" + this.age;
}
};
JSON.stringify(person);
// 结果:""ligang|26""
三、解析选项
JSON.parse(jsonText, fn),将JSON字符串解析为JavaScript值。fn将在每个键值对上调用。如果函数返回undefined,则要从结果中删除相应的键。
var person = {
name: "ligang",
age: 26,
birthday: new Date(1990, 02, 28)
};
var jsonText = JSON.stringify(person); // "{"name":"ligang","age":26,"birthday":"1990-03-27T16:00:00.000Z"}"
var jsonObj = JSON.parse(jsonText, function(key, value) {
if(key === "birthday") {
return new Date(value);
}else {
return value;
}
});
console.log(jsonObj.birthday.getFullYear()); // 1990