ECMAScript 5 对解析 JSON 的行为进行规范,定义了全局对象 JSON
核心方法: stringify() 和 parse()
JSON对象
把对象转成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”,”Geguo”],
“edition”:3,”year”:2011}
注意:
* 函数及原型成员都会被有意忽略,不体现在结果中。
* 此外,值为undefined 的任何属性也都会被跳过
* 结果中最终都是值为有效 JSON 数据类型的实例属性
将 JSON格式字符串转成对象
直接传递给 JSON.parse() 就可以得到相应的 JavaScript 值。
var bookCopy = JSON.parse(jsonText);
注意
虽然 book 与 bookCopy 具有相同的属性,但它们是两个独立的、没有任何关系的对象。
如果传给 JSON.parse() 的字符串不是有效的 JSON,该方法会抛出错误。
序列化选项
stringify()方法还可以接收两个其他参数
如果参数是数组,将过滤结果
var book = {
"title": "Professional JavaScript",
"authors": [
"Nicholas C. Zakas"
],
edition: 3,
year: 2011
};
// 只序列化 title,edition字段
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;
}
});
注意:
根据属性(键)名可以知道应该如何处理要序列化的对象中的属性。
属性名只能是字符串,而在值并非键值对儿结构的值时,键名可以是空字符串
为了改变序列化对象的结果,函数返回的值就是相应键的值
如果函数返回值是undefined,那么该属性会被忽略掉
转换结果:(editor属性被忽略)
{“title”:”Professional JavaScript”,
“authors”:”Nicholas C. Zakas”,”year”:5000}
第三个参数用来控制序列化缩进
JSON.stringify() 方法的第三个参数用于控制结果中的缩进和空白符。如果这个参数是一个数值,那它表示的是每个级别缩进的空格数。例如,要在每个级别缩进 4 个空格,可以这样写代码
var jsonText = JSON.stringify(book, null, 4);
保存在 jsonText 中的字符串如下所示:
{
"title": "Professional JavaScript",
"authors": [
"Nicholas C. Zakas"
],
"edition": 3,
"year": 2011
}
如果缩进参数是一个字符串而非数值,则这个字符串将在 JSON 字符串中被用作缩进字符(不再使用空格) 。在使用字符串的情况下,可以将缩进字符设置为制表符,或者两个短划线之类的任意字符
var jsonText = JSON.stringify(book, null, " - -");
这样, jsonText 中的字符串将变成如下所示:
{
--"title": "Professional JavaScript",
--"authors": [
----"Nicholas C. Zakas"
--],
--"edition": 3,
--"year": 2011
}
缩进字符的长度不能超过10个
toJson
解析选项
parse()还可以接收第二个参数,对值进行限制
第二个参数是一个函数,每个键值都会调用
var book = {
"title": "Professional JavaScript",
"authors": [
"Nicholas C. Zakas"
],
edition: 3,
year: 2016,
releaseDate: new Date(2016, 11, 7)
};
var jsonText = JSON.stringify(book);
var bookCopy = JSON.parse(jsonText, function(key, value){
//将Date类型字符串转成Date对象
if (key == "releaseDate"){
return new Date(value);
} else {
return value;
}