JSON(JavaScript Object Notation)javascript对象表示法,它是一种数据格式而不是语言。
JSON利用JavaScript的一些模式来表示结构化数据。
JSON是一个轻量级的数据格式。
【JSON语法】
JSON可以表示三种类型的值:
1. 简单值(String、Number、Boolean、null)但不支持undefined
2. 对象(表示一组无序的键值对)
3. 数组(表示一组有序的值的列表)
JSON不支持变量、函数、对象实例。
1.【简单值】
JSON表示字符串时,必须使用双引号。
2.【对象】
JSON表示对象时,属性要加引号
{
"属性0": 值,
"属性1":值,
}
与JS对象字面量
var object = {
"属性0": 值,
"属性1":值
};
相比,不同点在:
a. 没有声明变量
b. 花括号后面没有分号
c. 属性名必须加引号
3.【数组】
用中括号把元素集合在一起: [元素1,元素2,元素3……]
与JS数组相比:
a. 没有声明变量
b. 中括号后面没有分号
【JSON对象】
JSON对象有两个方法:
a. stringify(JS对象) //把JS对象序列化为JSON字符串
b. parse(JSON字符串) //解析为原生JavaScript值
【序列化为JSON】
在序列化JS对象时,函数和原型成员和值为undefined的属性会被忽略,结果都是那些值为有效的JSON数据类型的属性。
JSON.stringify(属性1,属性2,属性3)
属性1:JS对象
属性2:过滤器(数组或函数),结果只会返回包含在数组里的属性或按函数指示的属性和值
属性3:控制结果中缩进的个数或缩进的显示类型(数值或字符串),最大缩进空格数为10。若没有属性3,
则默认输出的JSON字符串没有空格或缩进。
//JS对象
var book = {
"title":"JSON",
"author":"karine",
"year":2017,
"content":["html","css","javascript"]
};
//序列化
var jsonText0 = JSON.stringify(book); //{"title":"JSON","author":"karine","year":2017,"content":["html","css","javascript"]}
var jsonText1 = JSON.stringify(book,["author","year"]);
//{"author":"karine","year":2017}
var jsonText2 = JSON.stringify(book,["author","year"],4);
// {
"author": "karine",
"year": 2017
}
给JS对象添加toJSON()方法,只会返回toJSON方法里描述的自身的JSON数据格式。JS对象会被序列化为一个简单的字符串而不是JSON对象。
toJSON()可以返回任意指定的值,undefined也可以。
var book1 = {
"title":"JSON",
"author":"karine",
"year":2017,
"content":["html","css","javascript"],
toJSON:function () {
return this.author;
}
};
var jsonText = JSON.stringify(book1); //"karine"
【使用JSON.stringify序列化对象的顺序】
1. 若存在toJSON()方法,则调用该方法返回值;否则返回对象本身
2. 若存在参数2,应用该过滤器,传入过滤器的值是第1步返回的值
3. 对第2步返回的每个值进行相应的序列化
4. 若存在参数3,执行相应的格式化
【解析JSON】
1. JSON.parse(JSON,还原函数)
若还原函数返回undefined,则在结果中删除相应的属性;若返回其他值,则将其插入到结果中。
//JS对象
var book = {
"title":"JSON",
"author":"karine",
"year":2017,
"content":["html","css","javascript"],
releaseDate:new Date(2017,7,22)
};
//序列化
var jsonText = JSON.stringify(book);
//解析
var jsonText4 = JSON.parse(jsonText,function(key,value){
if(key == "releaseDate"){
return new Date(value); //把序列化后的字符串还原解析为Date对象
}
else if(key =="year"){
return undefined; //会删除"year"
}
else{
return value;
}
});
//jsonText4输出值:
{ title: 'JSON',
author: 'karine',
content: [ 'html', 'css', 'javascript' ],
releaseDate: 2017-08-21T16:00:00.000Z
}
2.eval(json)
eval()也可以将json字符串解析成js对象(非标准的也可以,没有JSON.parse()要求严格,就算属性名不加双引号也可以执行)
JSON.parse('{name:"karine"}'); //SyntaxError:Unexpected token n in JSON
eval('{name:"karine"}'); //成功执行