如何区分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对象。