JSON
语法
- 简单值
- 字符串、数值、布尔值和 null
- 不支持 JavaScript中的特殊值 undefined
- 对象
- JSON 中的对象要求给属性加双引号 (不可写成单引号)
- 与 JavaScript的对象字面量相比:没有声明变量;没有末尾的分号
{
"name": "Nicholas",
"age": 29,
"school": {
"name": "Merrimack College",
"location": "North Andover, MA"
}
}
- 数组
- 利用对象和数组能够创造出各种各样的数据结构
[
{
"title": "Professional JavaScript",
"authors": [
"Nicholas C. Zakas"
],
edition: 3,
year: 2011
},
]
解析与序列化
- JSON对象
- JavaScript的eval()函数可以解析、解释并返回 JavaScript对象和数组。
- stringify():把 JavaScript对象序列化为 JSON字符串。
- parse():把 JSON字符串解析为原生 JavaScript值。
var book = {
title: "Professional JavaScript";
};
var jsonText = JSON.stringify(book);
- 序列化选项
JSON.stringify()可以接收另外两个参数,这两个参数用于指定以不同的方式序列化 JavaScript 对象。
第一个参数是个过滤器,可以是一个数组,也可 以是一个函数;第二个参数是一个选项,表示是否在 JSON字符串中保留缩进。
- 过滤结果
- 如果过滤器参数是数组,那么 JSON.stringify()的结果中将只包含数组中列出的属性
- 如果第二个参数是函数,传入的函数接收两个参数,属性(键)名和属性值。
- 根 据属性(键)名可以知道应该如何处理要序列化的对象中的属性(字符串)。
- 为了改变序列化对象的结果,函数返回的值就是相应键的值。
var jsonText = JSON.stringify(book, ["title", "edition"]);
{"title":"Professional JavaScript","edition":3}
var jsonText = JSON.stringify(book, function(key, value){
switch(key){
case "authors":
return value.join(",")
case "year":
return 5000;
default:
return value;
}
});
{"authors":"Nicholas C. Zakas","year":5000}
- 字符串缩进
- var jsonText = JSON.stringify(book, null, 4); //在每个级别缩进 4个空格
- 最大缩进空格数为 10,所有大于 10的值都会自动转换为 10
- 如果缩进参数是一个字符串而非数值,则这个字符串将在 JSON字符串中被用作缩进字符
var jsonText = JSON.stringify(book, null, " - -");
这样,jsonText 中的字符串将变成如下所示:
{
--"title": "Professional JavaScript",
--"authors": [
----"Nicholas C. Zakas"
--]
}
- toJSON()方法
- 给对象定义 toJSON()方法,返回其自身的JSON数据格式
- 假设把一个对象传 入 JSON.stringify(),序列化该对象的顺序如下。
- (1) 如果存在 toJSON()方法而且能通过它取得有效的值,则调用该方法。否则,返回对象本身。
- (2) 如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第(1)步返回的值。
- (3) 对第(2)步返回的每个值进行相应的序列化。
- (4) 如果提供了第三个参数,执行相应的格式化。
解析选项
- JSON.parse()方法也可以接收另一个参数,该参数是一个函数,将在每个键值对儿上调用。
- 如果还原函数返回 undefined,则表示要从结果中删除相应的键;如果返回其他值,则将该值插 入到结果中
var jsonText = JSON.stringify(book);
var bookCopy = JSON.parse(jsonText, function(key, value){
if (key == "releaseDate"){
return new Date(value);
} else {
return value;
}
});
alert(bookCopy.releaseDate.getFullYear());