JS原生JSON操作
本文介绍了兼容ECMAScript 5 标准的原生JSON对象。
原生JSON对象包含有两个关键方法。JSON.parse()方法用来解析JSON字符串,并且重构为JavaScript对象,而JSON.stringify()方法可以将javascript对象转换为等价的JSON字符串。
注意:由于JSON规范的限制,如果一个对象存在属性值为函数的属性,则在使用JSON.stringify()方法对该对象进行序列化时,这个属性将不会被遍历到。
解析JSON字符串
将JSON字符串解析成为一个JavaScript对象,你只需要将JSON字符串作为参数传递给JSON.parse()方法,如下:
var jsObject = JSON.parse(jsonString);
// JavaScript 1.8.5中,下述两行代码都会抛出SyntaxError异常
// 引入于 JavaScript 1.8.5 (Firefox 4),JSON.parse()不允许最后一个键值对后面存在逗号
var jsObject = JSON.parse("[1, 2, 3, 4, ]");
var jsObject = JSON.parse("{ \"foo\" : 1, }");
将对象转为JSON
将一个JavaScript对象字符串化为JSON,你只需要将该对象作为参数传递给JSON.stringify()方法,如下:
var foo = {};
foo.bar = "new property";
foo.baz = 3;
var jsonString = JSON.stringify(foo);
jsonString 的新值为'{“bar”:“new property”,“baz”:3}'。
从Firefox 3.5.4起,JSON.stringify()提供一个可选参数来提供额外的自定义转换方法的能力。如下:
jsonString = JSON.stringify(value [, replacer [, space]])
value
将要转为JSON字符串的javascript对象。
replacer
该参数可以是多种类型,如果是一个函数,则它可以改变一个javascript对象在字符串化过程中的行为,如果是一个包含 String 和 Number 对象的数组,则它将作为一个白名单。只有那些键存在域该白名单中的键值对才会被包含进最终生成的JSON字符串中。如果该参数值为null或者被省略,则所有的键值对都会被包含进最终生成的JSON字符串中。
space
该参数可以是一个 String 或 Number 对象,作用是为了在输出的JSON字符串中插入空白符来增强可读性。如果是Number对象,则表示用多少个空格来作为空白符;最大可为10,大于10的数值也取10。最小可为1,小于1的数值无效,则不会显示空白符。如果是个 String对象,则该字符串本身会作为空白符,字符串最长可为10个字符。超过的话会截取前十个字符。如果该参数被省略 (或者为null), 则不会显示空白符。
replacer 参数
replacer参数可以是一个函数或者是一个数组。如果是函数,则该函数会被传入两个参数,分别是当前正在被字符串化的键值对的键和值。初始化时,一个默认的键值对(键为空,值为要JSON化的对象)会传入这个函数,然后,要JSON化的对象或者数组的每个键值对也会一级一级被传入这个函数。该函数的返回值会影响正在被字符串化的键值对会不会被加入最终生成的JSON字符串中化,如下:
- 如果返回一个 Number 类型的值,则该数字会通过toString方法转换成字符串,来作为正在被字符串化的键值对中的值被添加到JSON字符串中。
- 如果返回一个 String 类型的值, 则该字符串会作为正在被字符串化的键值对中的值被添加到JSON字符串中。
- 如果返回一个 Boolean类型的值, 则该布尔值会转化成字符串"true"或"false”,来作为正在被字符串化的键值对中的值被添加到JSON字符串中。
- 如果返回一个其他类型的对象,则该对象的键值对会被递归的按照上述的规则添加到JSON字符串中,但如果该对象是function类型的,则它不会变遍历。replacer函数会转而处理下一个键值对。
- 如果返回 undefined,则该键值对不会被添加到JSON字符串中。
注意:你不能通过 replacer 函数剔除数组中的某些值。
举个栗子:
function censor(key, value) {
if (typeof(value) == "string") {
return undefined;
}
return value;
}
var foo = {foundation: "Mozilla", model: "box", week: 45, transport: "car", month: 7};
var jsonString = JSON.stringify(foo, censor);
jsonString 的新值为{“week”:45,“month”:7}.
如果 replacer 是一个数组,则源对象中,只有键存在replacer数组中的键值对,才会被包含进最终的JSON字符串中。