JSON.parse和JSON.stringify
2021 javascriptJSON 包含了两个静态方法,分别是 JSON.parse
和JSON.stringify
。
JSON.parse
JSON.parse 解析一个 JSON 字符串,转换成 JavaScript 值或者对象。
语法
JSON.parse(text);
JSON.parse(text, reviver);
text:被解析成 JSON 的字符串。
reviver:可选参数,如果是函数,返回解析出来的值的转换值。
例子
JSON.parse('{}'); // {}
JSON.parse('true'); // true
JSON.parse('"foo"'); // "foo"
JSON.parse('[1, 5, "false"]'); // [1, 5, "false"]
JSON.parse('null'); // null
使用 reviver 参数
reviver 包含的两个参数分别是属性名称,属性值。
JSON.parse('{"p": 5, "s": "str"}', (key, value) =>
(typeof value === 'number' ? value * 2 : value)
);
// { p: 10, s: "str" }
错误情况
以下情况会抛出错误
-
不允许尾部逗号
JSON.parse('[1, 2, 3, 4, ]'); JSON.parse('{"foo": 1,}');
-
不允许单引号
JSON.parse("{'foo': 1}");
JSON.stringify
JSON.stringify 将 JavaScript 值或者对象转换成一个 JSON 字符串。
语法
JSON.stringify(value);
JSON.stringify(value, replacer);
JSON.stringify(value, replacer, space);
value:转换成 JSON 字符串的值。
replacer:可选参数,改变字符串格式化过程的格式,或者一个字符串或者数字的数组。
- 如果是一个函数,则 value 的每个属性都要经过函数的处理。
- 如果是一个数组,则包含在数组内的属性才会被序列化。
- 如果未提供或者 null,则 value 所有的属性都会被序列化。
space:一个字符串或数字对象,用于在输出的 JSON 字符串中插入空白。
- 如果是数字,代表有多少个空格,上限为10。小于1,代表没有空格。
- 如果是字符串,空格替换成字符串,上限为10个字母。
- 如果未提供或者 null,代表没有空格。
异常
- 当序列化循环对象值(cyclic object value)会抛出
TypeError
。 - 当序列化 BigInt 值会抛出
TypeError
,BinInt 值不能在 JSON 里序列化。
var circularRefer = { data: 123 };
circularRefer.myself = circularRefer;
JSON.stringify(circularRefer); // TypeError: cyclic object value
const huge = BigInt(1234);
JSON.stringify(huge); // TypeError: BigInt value can't be serialized in JSON
描述
-
如果序列化的值有
toJSON()
的方法,调用该方法进行序列化。如我们之前的 BigInt 是无法被序列化的,我们可以通过自己实现 toJSON 方法
BigInt.prototype.toJSON = function() { return this.toString() } JSON.stringify(BigInt(1)); // '"1"'
-
Number
,Boolean
和String
对象会被转换成对应的原始值。JSON.stringify([new Number(3), new String('false'), new Boolean(false)]); // '[3, "false", false]'
-
undefined
、Function
和Symbol
不是有效的 JSON 值,在数组内被转换成 null,在对象内被忽略。当传入“纯”值时,返回 undefined。JSON.stringify([undefined, function() {}, Symbol('')]); // "[null,null,null]" JSON.stringify({u: undefined, f: function() {}, s: Symbol('')}); // "{}" JSON.stringify(function() {}); // undefined 注:这里不是序列化的 "undefined" 字符串 JSON.stringify(undefined, Symbol('')); // undefined 注:这里不是序列化的 "undefined" 字符串
-
所有用 Symbol 作为键值都会被忽略,即使在 replacer 函数内。
JSON.stringify({ [Symbol('foo')]: 'foo' }); // '{}'
-
Date 类型通过实现 toJSON 函数返回一个字符串(该方法等同于 date.toISOString())。
JSON.stringify(new Date(2006, 0, 2, 15, 4, 5)); // '"2006-01-02T15:04:05.000Z"' new Date(2006, 0, 2, 15, 4, 5).toISOString(); // "2006-01-02T15:04:05.000Z"
-
数字
Infinity
和NaN
,以及null
值都被当成 null。JSON.stringify([NaN, null, Infinity]); // '[null,null,null]'
-
所有其他对象实例(包括 Map、Set、WeakMap 和 WeakSet)都只序列化它们的可枚举属性。
JSON.stringify([new Set([1]), new Map([[1, 2]])]); // '[{},{}]' JSON.stringify([new WeakSet([{a: 1}]), new WeakMap([[{a: 1}, 2]])]); // '[{},{}]' var o = Object.create(null, { x: { value: 'x', enumerable: false }, y: { value: 'y', enumerable: true }}); JSON.stringify(o); // '{"y":"y"}'