JSON
前言
经常需要接触接口的json文件,所以做一个笔记来了解一下json。
语法
JSON的语法可以表示下列3种类型的值:
* 简单值
* 对象
* 数组
不支持变量,函数和对象实例,具体怎么表示上面3种值,分节讲解。
1.简单值
最简单的json数据可以直接传数字,字符串等:
1
"hello"
不过字符串只限于双引号标识,不能用js中的单引号。
2.对象
与js中的对象相比有几个区别:
* 不需要声明对象名
* 末尾没有冒号
* 对象的属性必须加双引号
//js
var person = {
name: "Nicholas",
age: 29
};
//json
{
"name": "Nicholas",
"age": 29
}
3.数组
json数组也没有变量和分号。
//js
var values = [25, "hi", true];
//json
[25, "hi", true]
//较为复杂的json数据结构
[
{
"title": "Professional JavaScript",
"authors": [
"Nicholas C. Zakas"
],
edition: 3,
year: 2011
},
{
"title": "Professional JavaScript",
"authors": [
"Nicholas C. Zakas"
],
edition: 2,
year: 2009
},
{
"title": "Professional Ajax",
"authors": [
"Nicholas C. Zakas",
"Jeremy McPeak",
"Joe Fawcett"
],
edition: 2,
year: 2008
},
{
"title": "Professional Ajax",
"authors": [
"Nicholas C. Zakas",
"Jeremy McPeak",
"Joe Fawcett"
],
edition: 1,
year: 2007
}]
解析与序列化
json数据可以解析成有用的js对象,js对象也可以序列化成json数据格式。
1.json对象
stringify
把js对象序列化成json数据格式
var book = {
title: "Professional JavaScript",
authors: [
"Nicholas C. Zakas"
],
edition: 3,
year: 2011
};
var jsonText = JSON.stringify(book);
//{"title":"Professional JavaScript","authors":["Nicholas C. Zakas"],"edition":3,"year":2011}
parse
把json数据解析成有用的js对象
var bookCopy = JSON.parse(jsonText);
传递错误的json数据会报错
2.序列化选项
JSON.stringify还可以另外两个参数,用于指定序列化的方式:
* 参数一:过滤器,可以是数组,也可以是函数
* 参数二: 选项,表示在json字符中保留缩进
过滤器
只返回要求序列化的属性:
数组形式
var book = {
"title": "Professional JavaScript",
"authors": [
"Nicholas C. Zakas"
],
edition: 3,
year: 2011
};
var jsonText = JSON.stringify(book, ["title", "edition"]);
//{"title":"Professional JavaScript","edition":3}
函数形式:
对相应属性进行操作
var book = {
"title": "Professional JavaScript",
"authors": [
"Nicholas C. Zakas"
],
edition: 3,
year: 2011
};
var jsonText = JSON.stringify(book, function(key, value){
switch(key){
case "authors":
return value.join(",")
case "year":
return 5000;
case "edition":
return undefined;
default:
return value;
}
});
//{"title":"Professional JavaScript","authors":"Nicholas C. Zakas","year":5000}
字符串缩进
JSON.stringify()方法的第三个参数用于控制结果中的缩进和空白符。如果这个参数是一个数
值,那它表示的是每个级别缩进的空格数。如果缩进参数是一个字符串而非数值,则这个字符串将在 JSON 字符串中被用作缩进字符(不再使用空格)。在使用字符串的情况下,可以将缩进字符设置为制表符,或者两个短划线之类的任意字符。
toJSON()方法
有时候, JSON.stringify()还是不能满足对某些对象进行自定义序列化的需求。在这些情况下,可以给对象定义 toJSON()方法,返回其自身的 JSON 数据格式。原生 Date 对象有一个 toJSON()方法,能够将 JavaScript的 Date 对象自动转换成 ISO 8601日期字符串(与在 Date 对象上调用 toISOString()的结果完全一样)。
可以为任何对象添加 toJSON()方法,比如:
var book = {
"title": "Professional JavaScript",
"authors": [
"Nicholas C. Zakas"
],
edition: 3,
year: 2011,
toJSON: function(){
return this.title;
}
};
var jsonText = JSON.stringify(book);
//Professional JavaScript
3.解析选项
JSON.parse()方法也可以接收另一个参数,该参数是一个函数,将在每个键值对上调用。
var book = {
"title": "Professional JavaScript",
"authors": [
"Nicholas C. Zakas"
],
edition: 3,
year: 2011,
releaseDate: new Date(2011, 11, 1)
};
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());
以上代码先是为 book 对象新增了一个 releaseDate 属性,该属性保存着一个 Date 对象。这个对象在经过序列化之后变成了有效的 JSON 字符串,然后经过解析又在 bookCopy 中还原为一个 Date对象。还原函数在遇到”releaseDate”键时,会基于相应的值创建一个新的 Date 对象。结果就是bookCopy.releaseDate 属性中会保存一个 Date 对象。正因为如此,才能基于这个对象调用getFullYear()方法。