1.基本语法
json的语法可以表示为三种类型的值
1.简单值:适用于js相同的语法,可以在json中表示字符串、数值、布尔值和null,但是不支持undefined。
- json字符串与js字符串最大的不同是在json中字符串
2.对象:表示一组无序的键值对。
{
"name":"lucy",
"age":"22"
}
与js中的字面量不同,json中的对象不需要声明(json中没有变量的概念),其次,没有末尾的分号。
3.数组:表示一组有组的值的列表。
["hi",25,"js"]
把数组和对象结合起来,就能构成更复杂的数据集合。
2.序列化JSON
stringify方法,主要用于把JavaScript对象序列化为json字符串。
var book = {
title:"Professional JavaScript",
authors:[
"Nicholas C. Zakas"
],
edition:3,
year:2011
}
var jsonText = JSON.stringify(book);
console.log(jsonText);
/*运行结果,不包含任何空格或缩进*/
//{"title":"Professional JavaScript","authors":["Nicholas C. Zakas"],"edition":3,"year":2011}
该方法还可以接受参数,两个参数用于以不同的方式序列化JavaScript对象。第一个参数是一个过滤器,可以是数组,也可以是函数。第二个参数是一个选项,用来表示是否在JSON对象中保留缩进。
1、过滤器参数为数组。
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}
2.过滤器参数为函数。
var book = {
title:"Professional JavaScript",
authors:[
"Nicholas C. Zakas"
],
edition:3,
year:2011
}
var jsonText = JSON.stringify(book, function (key,value) {
///如果返回的值为undefined,则相应的属性会被忽略掉
switch(key){
case "authors":
return value.join(',');
case "edition":
return undefined;
case "year":
return 5000;
default : //如果不设置default的值,其他的属性有可能会被忽略掉
return value;
}
});
console.log(jsonText);
//{"title":"Professional JavaScript","authors":"Nicholas C. Zakas","year":5000}
3.字符串缩进
var book = {
title:"Professional JavaScript",
authors:[
"Nicholas C. Zakas"
],
edition:3,
year:2011
}
var jsonText = JSON.stringify(book, null, 4);
console.log(jsonText);
// {
// "title": "Professional JavaScript",
// "authors": [
// "Nicholas C. Zakas"
// ],
// "edition": 3,
// "year": 2011
// }
4.toJSON()方法:
可以为任何对象添加toJSON方法。可以作为过滤器的补充。
var book = {
title:"Professional JavaScript",
authors:[
"Nicholas C. Zakas"
],
edition:3,
year:2011,
toJSON: function () {
return this.title;
}
}
var jsonText = JSON.stringify(book);
console.log(jsonText);//"Professional JavaScript"
序列化的内部顺序:
1,如果存在toJSON()方法并且能通过他取得有效的值,则调用该方法。否则,返回对象本身。
2.如果存在第二个参数,应用过滤器,传入过滤器的值应该为第一步得到的值。
3.对第二部得到的结果进行序列化。
4.如果提供了第三个参数,执行相应的序列化。
3.解析JSON
JSON.parse()方法:将JSON字符串解析为原生的javaScript值。也可以接受一个参数,这个参数是一个函数,可以在每一对键值对上进行调用。
var book = {
title:"Professional JavaScript",
authors:[
"Nicholas C. Zakas"
],
edition:3,
year:2011,
relaseDate:new Date(2016,11,11)
}
var jsonText = JSON.stringify(book);
var bookCopy = JSON.parse(jsonText, function (key,value) {
if(key == 'relaseDate'){
return new Date(value);
}else{
return value;
}
});
console.log(bookCopy);
运行结果::