JSON本质上就是一个字符串
// json
var json = '{"name":"jsong","age":18}';
// 对象
var obj = { name: 'jsong', age: 18 };
- 对象转JSON字符串,结果都是字符串
JSON.stringify(obj)
JSON.stringify(11); // "11"
JSON.stringify('11'); // ""11""
JSON.stringify(null); // null
JSON.stringify(true); // "true"
- JSON 字符串转对象
JSON.parse(jsonStr)
JSON.parse(11); // 11
JSON.parse('11'); // 11
JSON.parse('"11"'); // "11"
JSON.parse('null'); // null
JSON.parse('true'); // true
不安全的JSON值
undefined,function,symbol,循环引用都是不安全的JSON值,在对象中遇到undefined,function,symbol时会自动将其忽略,在数组中返回null
JSON.stringify(undefined); // undefined
JSON.stringify(function() {}); // undefined
JSON.stringify(Symbol(1)); // undefined
JSON.stringify([1, undefined, function() {}, 2]); // "[1,null,null,2]"
JSON.stringify({ a: 1, b: function() {} }); // "{"a":1}"
自定义toJSON()
当对象中定义了toJSON()方法, JSON字符串化会先调用该方法。
toJSON()返回一个能够被字符串化的安全JSON值,而不是一个JSON字符串
var a = { b: 1 };
a.toJSON = function() {
return { c: 4 };
};
console.log(JSON.stringify(a)); // {"c":4}
当对含有不安全JSON值的对象字符串化时,可以自定义toJSON()
var o = {},
obj = {
a: 1,
b: o,
c: function() {}
};
o.d = obj;
JSON.stringify(obj); // 循环引用,报错
a.toJSON = function() {
return { obj: this.a };
};
console.log(JSON.stringify(obj));
JSON.stringify(obj); // {"a":1}
JSON.stringify()参数
- 传递replacer,可以是数组或者函数,用处理排除属性。
如果是数组,必须是字符串数组,包含要处理的属性名,其他的属性会被忽略
var a = { b: 1, c: '1', d: [1, 2, 3] };
JSON.stringify(a, ['b', 'c']); // {"b":1,"c":"1"}
如果是函数,对象本身调用一次,然后每个数据各调用一次,传递连个参数,键和值
JSON.stringify(a, function(k, v) {
if (k !== 'c') return v;
}); // {"b":1,"d":[1,2,3]}
- 传递space,指定缩进格式,space为正整数时,指定每一级缩进的字符数,space为字符串时,最前面的十个字符被用于缩进
var a = { b: 1, c: '1', d: [1, 2, 3] };
// {
// "b": 1,
// "c": "1",
// "d": [
// 1,
// 2,
// 3
// ]
// }
JSON.stringify(a, null, 3);
// {
// -------"b": 1,
// -------"c": "1",
// -------"d": [
// --------------1,
// --------------2,
// --------------3
// -------]
// }
JSON.stringify(a, null, '-------');