一种数据格式,太常用了。
ES5中定义了一个全局对象JSON,有两个方法:stringify()和parse(),分别用于序列化和解析。
1. JSON的序列化
var person = { name: ‘smallSan‘, age: 21, job: null, ‘‘: 123, title: window.undef, // 并没有该属性 sayName: function(){ console.info(this.name); } }; JSON.stringify(person); //"{"name":"smallSan","age":21,"job":null,"":123}"
默认情况下,JSON.stringify()输出的JSON串不包含任何空格和缩进,如上。
在序列化JS对象时,所有的函数及原型成员都会被忽略,值为undefined的熟悉也会被忽略。
序列化的选项
JSON.stringify()除了要序列化的JS对象外,还可接受两个参数:过滤器(可以是数组或函数)、缩进的空格数。
过滤器为数组:结果中只包含数组中列出的属性。
JSON.stringify(person, [‘name‘, ‘jod‘]); // "{"name":"smallSan"}"
过滤器为函数:传入的函数接收属性名和值两个参数,属性名只能为串,但可为空串,为了改变序列化对象的结果,函数返回的值就是该属性的值,若函数返回undefined,则对应属性被忽略。
JSON.stringify(person, function (k, v) { if (k == ‘age‘) return undefined; return v; }); // "{"name":"smallSan","job":null,"":123}"
缩进的空格数:
最大缩进空格数为10,大于10会转为10。
toJSON()方法
若给对象定义了toJSON()方法,那么JSON.stringify(obj)就会调用obj的toJSON()方法。
var person = { name : ‘smallSan‘, age : 21, job : null, ‘‘ : 123, title : window.undef, // 并没有该属性 sayName : function () { console.info(this.name); }, toJSON : function () { return this.name; } }; JSON.stringify(person); // "smallSan"
2. JSON的解析
JSON是JavaScript语法的子集,因此可以使用eval()解析。
鉴于eval()比较危险,一般使用JSON.parse()解析。
JSON.parse()也可接收与序列化时过滤函数相同的函数(还原函数),该函数返回undefined,表示从结果中删除相应键,否则插入结果中。
将日期字符串转为日期对象时,还原函数较为常用。
var book = { "title" : "Professional JavaScript", "authors" : [ "Nicholas C. Zakas" ], edition : 3, year : 2011, releaseDate : new Date(2011, 11, 1) }; var jsonText = JSON.stringify(book); var bookCopy = JSON.parse(jsonText, function (key, value) { if (key == "releaseDate") { return new Date(value); } else { return value; } }); console.info(bookCopy.releaseDate.getFullYear()); // 2011
时间: 2024-10-25 13:21:19