JSON,stringify()注意事项

文章类型:Vue

发布者:admin

发布时间:2022-10-24

在使用 JSON.stringify() 方法时,如循环引用、undefined 值、NaN 和 Infinity 值、Date、Function 和 RegExp 类型等问题。

为了避免这些问题,我们可以使用 JSON.stringify() 方法的第二个参数 replacer,传入一个函数,在处理属性时做出相应的处理

一:循环引用问题,当对象中存在循环引用时,调用 JSON.stringify() 方法将会抛出错误

const obj = { a: 1 };
obj.b = obj;

JSON.stringify(obj); // TypeError: Converting circular structure to JSON

//解决方案
const jsonString = JSON.stringify(obj, function (key, value) {
if (typeof value === 'object' && value !== null) {
if (cache.includes(value)) { // 判断是否存在循环引用
return; // 忽略该属性
}
cache.push(value); // 记录处理过的对象
}
return value;
});

console.log(jsonString); // Output: {"a":1}

二:undefined 值问题

const obj = { a: 1, b: undefined };
JSON.stringify(obj); // Output: {"a":1}

//解决方案
const jsonString = JSON.stringify(obj, function (key, value) {
return value === undefined ? null : value;
});

三:NaN 和 Infinity 问题,当对象属性的值为 NaN 或 Infinity 时,在调用 JSON.stringify() 方法时,该属性值会被转换为字符串 "null"

const obj = { a: 1, b: NaN, c: Infinity };
JSON.stringify(obj); // Output: {"a":1,"b":null,"c":null}

//解决方案
const jsonString = JSON.stringify(obj, function (key, value) {
if (value !== value || value === Infinity || value === -Infinity) {
return "Invalid number";
}
return value;
});

四:函数/Date属性问题:如果对象的属性值为函数,使用 JSON.stringify() 方法后,该属性也会被忽略掉

const obj = { a: 1, b: new Date(), c: function(){} };
JSON.stringify(obj); // Output: {"a":1}

//解决方案
const jsonString = JSON.stringify(obj, function (key, value) {
if (value instanceof Date) {
return { __type: "date", value: value.getTime() };
} else if (typeof value === "function") {
return value.toString();
}
return value;
});

五:RegExp 类型问题:对象属性的值为 RegExp 类型时,在调用 JSON.stringify() 方法时,该属性值会被转换为空对象

const obj = { a: 1, b: /test/g };
JSON.stringify(obj); // Output: {"a":1,"b":{}}

//解决方案
const jsonString = JSON.stringify(obj, function (key, value) {
if (value instanceof RegExp) {
return { __type: "regexp", value: value.toString() };
}
return value;
});