js中的JSON.stringify()与JSON.parse()

2018-1-17 23:18:13 4,473 views

如何区分js对象与JSON对象?

1.json中没有声明变量(json中没有变量的概念)
2.没有末尾的分号

json数组

[{"title":"hello"
},{
"title":"mike"
}]

 

解析JSON对象

eval()函数,解析json对象
较早版本可以使用shim
对象的2个方法:
接续与序列化
stringify():用于把js对象序列化为json字符串
parse():把json字符串解析为原生js值
在序列化js对象时,所有函数及原型成员都会被有意忽略,值为undefined的任何属性也都会被跳过。结果中最终都是值为有效json数据类型的实例属性。
var book = {
a: undefined,
title: "js",
authors: ["mike"],
edition: 3,
year: 2011,
b: function() {
console.log(this.title)
}
 
}
console.log(JSON.stringify(book));
//"{"title":"js","authors":["mike"],"edition":3,"year":2011}"

 

值为undefined的被直接跳过,函数也被忽略了
js对象==>为json字符串==>js对象 首尾的js对象没什么关系,相互独立
var book = {
a: undefined,
title: "js",
authors: ["mike"],
edition: 3,
year: 2011,
b: function() {
console.log(this.title)
}
 
}
var jsonText = JSON.stringify(book); //将js对象转换为json字符串
var jsObj = JSON.parse(jsonText); //将json字符串转换为js对象
//如果传给JSON.parse()的字符串不是有效的json,该方法会抛出错误
console.log(jsObj);

 

序列化选项

JSON.stringify()除了要序列化的js对象外,还可以接受2个参数,指定以不同的方式序列化js对象
第一个参数是过滤器,可以是数组,也可以是一个函数
第二个参数是一个选项,表示是否在JSON字符串中保留缩进。

1.过滤结果

如果过滤器参数是数组,那么JSON.stringify()的结果中将只包含数组中列出的属性
var book = {
a: undefined,
title: "js",
authors: ["mike"],
edition: 3,
year: 2011,
b: function() {
console.log(this.title)
}
 
}
var jsonText = JSON.stringify(book, ["title"]);
//将js对象转换为json字符串
console.log(jsonText);//{"title":"js"}

 

2.过滤器参数是函数

传入的函数接受2个参数,属性名和属性值。根据属性名可以知道应该如何处理要序列化的对象中的属性。属性名只能是字符串,而在值并非键值对结构的值时,键名可以是空字符串。
如果函数返回了undefined,那么相应的属性会被忽略
var book = {
a: undefined,
title: "js",
authors: ["mike"],
edition: 3,
year: 2011,
b: function() {
console.log(this.title)
}
 
}
var jsonText = JSON.stringify(book, function(key, value) {
switch(key) {
case "authors":
return value.join(",");
case "edition":
return undefined;
case "year":
return 5000;
default:
return value;
 
}
}); //将js对象转换为json字符串
console.log(jsonText); //{"title":"js","authors":"mike","edition":3,"year":5000}

 

函数过滤器根据传入的键来决定结果。如果键为“authors”,就将数组连接为一个字符串,如果键为"year",则将其值设置为5000;如果键为"edition",通过返回undefined删除该属性。
最后一定要提供default项,此时返回传入的值,以便其他值能够正常出现在结果中。

字符串缩进

JSON.tostringify()方法的第三参数用于控制结果中的缩进和空白符。
如果这个参数是一个数值,表示每个级别缩进的空格数
var book = {
a: undefined,
title: "js",
authors: ["mike"],
edition: 3,
year: 2011,
toJSON: function() {
return this.title;
}
 
}
var jsonText = JSON.stringify(book,null,4); //将js对象转换为json字符

 

最大缩进空格数位10,所有大于10的值都会自动转换为10;
如果缩进参数是一个字符串而非数值,则这个字符串将在JSON字符串中被用作缩进字符
var jsonText = JSON.stringify(book,null,"--");

toJSON()方法

有时候,JSON.stringify()还是不能满足对某些对象进行自定义序列化的需求。
var book = {
a: undefined,
title: "js",
authors: ["mike"],
edition: 3,
year: 2011,
toJSON: function() {
return this.title;
}
 
}
var jsonText = JSON.stringify(book); //将js对象转换为json字符串
console.log(jsonText);//"js"

 

解析选项

JSON.parse()方法也可以接收另一个参数,该参数是一个函数,将在每个键值对儿上调用。
JSON.stringify()替换函数, JSON.parse()还原函数。
如果还原函数返回undefined,则表示要从结果中删除相应的键。如果返回其他值,则将该值插入到结果中。在将日期字符串转换为Date对象时,经常要用到还原函数。
var book = {
a: undefined,
title: "js",
authors: ["mike"],
edition: 3,
year: 2011,
releaseDate: new Date(2011, 11, 1)
 
}
var jsonText = JSON.stringify(book); //将js对象转换为json字符串
var bookCopy = JSON.parse(jsonText, function(key, value) {
if(key == "releaseDate") {
return new Date(value);
} else {
return value;
}
});
console.log(bookCopy.releaseDate.getFullYear()); //"js"

 

//以上代码先是为book对象新增了一个releaseDate属性,该属性保存着一个Date对象。这个对象在经过序列化之后变成了有效的JSON字符串,然后经过解析又在bookCopy中还原为一个Date对象。还原函数在遇到“releaseDate”键时,会基于相应的值创建一个新的Date对象。结果就是bookCopy.releaseDate属性中会保存一个Date对象。

2

分享到微信朋友圈

打开微信,点击底部的“发现”,
使用“扫一扫”即可将网页分享至朋友圈。