JSON.stringify(value[, replacer [, space]])
value
JSON
字符串的值。replacer
(可选)
JSON
字符串中。null
或者未提供,则对象所有的属性都会被序列化。space
(可选)
一个表示给定值的JSON
字符串。
TypeError
(“cyclic object value”)(循环对象值)BigInt
类型的值会抛出TypeError
(“BigInt value can’t be serialized in JSON”)(BigInt
值不能JSON
序列化)。JSON.stringify({
}); // '{}'
JSON.stringify(true); // 'true'
JSON.stringify("foo"); // '"foo"'
JSON.stringify([1, "false", false]); // '[1,"false",false]'
JSON.stringify({
x: 5 }); // '{"x":5}'
// 使用第二个参数
let replacerFun = function (key, value) {
if (key === 'name') {
return undefined
}
return value
}
let user = {
name: '夏安',
age: 20,
id: '123'
}
JSON.stringify(user, replacerFun); // '{"age":20,"id":"123"}'
JSON.stringify(user, ["age"]); // '{"name":"夏安","id":"123"}'
// 为了便于使用 '--' 替代了空格
JSON.stringify(user, null, 2);
//{
//--"name": "夏安",
//--"age": 20,
//--"id": "123"
//}
如果一个被序列化的对象拥有 toJSON
方法,那么 toJSON
方法后的返回值会被序列化,例如:
var obj = {
foo: 'foo',
toJSON: function () {
return 'bar';
}
};
JSON.stringify(obj); // '"bar"'
JSON.stringify({
x: obj}); // '{"x":"bar"}'
undefined
、任意的函数以及 symbol
值会被转换成 null
JSON.stringify([undefined, Object, Symbol("")]); // '[null,null,null]'
undefined
、任意的函数以及 symbol
值在序列化的过程中会被忽略JSON.stringify({
x: undefined, y: Object, z: Symbol("")}); // '{}'
NaN
和 Infinity
会被转换成 null
let user = {
name: '夏安',
age: Infinity,
id: NaN
}
JSON.stringify(user); // '{"name":"夏安","age":null,"id":null}'
JSON.stringify(['夏安', NaN, Infinity]); // '["夏安",null,null]'
JSON.stringify(
Object.create(
null,
{
x: {
value: 'x', enumerable: false },
y: {
value: 'y', enumerable: true }
}
)
);
// "{"y":"y"}"
这个时候第二个参数就可以发挥作用了:
JSON.stringify({
x: undefined, y: Object, z: Symbol("")}, (key, value) => {
if (typeof value === 'undefined') {
return 'undefined'
} else if (typeof value === 'symbol' || typeof value === 'function') {
return value.toString()
}
return value
});
// '{"x":"undefined","y":"function Object() { [native code] }","z":"Symbol()"}'
undefined
、任意的函数以及 symbol
被 JSON.stringify()
作为单独的值进行序列化时都会返回 undefined
JSON.stringify(function a (){
console.log('a')}); // undefined
JSON.stringify(undefined); // undefined
JSON.stringify(Symbol('dd')); // undefined
JSON.stringify()
将会正常序列化 Date
的值。JSON.stringify({
now: new Date() });
// '{"now":"2021-11-21T12:07:01.054Z"}'
实际上 Date
对象内置了 toJSON()
方法(同Date.toISOString()
),因此 Date
对象会被当做字符串处理。
JSON.parse(text[, reviver])
text
JavaScript
值的字符串。reviver
(可选)
reviver
函数,在调用过程中,当前属性所属的对象会作为 this
值,当前属性名和属性值会分别作为第一个和第二个参数传入 reviver
中。如果 reviver
返回 undefined
,则当前属性会从所属对象中删除,如果返回了其他值,则返回的值会成为当前属性新的属性值。reviver
函数的参数会是空字符串 ""
(因为此时已经没有真正的属性)和当前的解析值(有可能已经被修改过了),当前的 this
值会是 {"": 修改过的解析值}
Object
类型, 对应给定 JSON
文本的对象/值。
若传入的字符串不符合 JSON
规范,则会抛出 SyntaxError
异常。
JSON.parse('{}'); // {}
JSON.parse('true'); // true
JSON.parse('"foo"'); // "foo"
JSON.parse('[1, 5, "false"]'); // [1, 5, "false"]
JSON.parse('null'); // null
JSON.parse('{"p": 5}', function (k, v) {
if(k === '') return v; // 如果到了最顶层,则直接返回属性值,
return v * 2; // 否则将属性值变为原来的 2 倍。
}); // { p: 10 }
JSON.parse('{"1": 1, "2": 2,"3": {"4": 4, "5": {"6": 6}}}', function (key, value) {
console.log(key); // 输出当前的属性名,从而得知遍历顺序是从内向外的,
// 最后一个属性名会是个空字符串。
return value; // 返回原始属性值,相当于没有传递 reviver 参数。
});
// 1
// 2
// 4
// 6
// 5
// 3
// ""
let user = {
name: '夏安',
age: 20,
id: '123'
}
let user2 = JSON.parse(JSON.stringify(user));
user2.age = 66;
console.log(user.age); // 20
console.log(user2.age); //66
JSON.stringify([1, 2, 3]) === JSON.stringify([1, 2, 3]);// true
一些时候,你想存储用户创建的一个对象,并且,即使在浏览器被关闭后仍能恢复该对象。
我们知道 localStorage
/sessionStorage
只可以存储字符串,当我们想存储对象的时候,需要使用 JSON.stringify
转换成字符串,获取的时候再 JSON.parse
// 创建一个示例数据
var session = {
'screens' : [],
'state' : true
};
session.screens.push({
"name":"screenA", "width":450, "height":250});
session.screens.push({
"name":"screenB", "width":650, "height":350});
session.screens.push({
"name":"screenC", "width":750, "height":120});
session.screens.push({
"name":"screenD", "width":250, "height":60});
session.screens.push({
"name":"screenE", "width":390, "height":120});
session.screens.push({
"name":"screenF", "width":1240, "height":650});
// 使用 JSON.stringify 转换为 JSON 字符串
// 然后使用 localStorage 保存在 session 名称里
localStorage.setItem('session', JSON.stringify(session));
// 然后是如何转换通过 JSON.stringify 生成的字符串,该字符串以 JSON 格式保存在 localStorage 里
var restoredSession = JSON.parse(localStorage.getItem('session'));
// 现在 restoredSession 包含了保存在 localStorage 里的对象
console.log(restoredSession);
参考: