JSON.stringify() 方法
JSON.stringify() 方法用于将 JavaScript 对象或者值转换为 JSON 格式,如果指定了替换函数,则可选择替换值,或者如果指定了替换数组,则可选择仅包含指定的属性。
Replacer 是一个修改字符串化过程行为的函数,或者一个字符串和数字对象的数组。
如果 replacer 的值为 null 或者未给出,则所有对象的属性都包含在结果 JSON 字符串中。
循环结构不是在 JSON 中,而是在正在转换为 JSON 的对象中。
循环结构来自包含引用原始对象的对象的对象。
使用 JSON.stringify 可以将循环结构转换为 JSON 格式。
将它与自定义替换器一起使用,如本例所示:
//Circular reference let circ = { a: 1 }; circ.a = circ; //请注意,不应通过重复调用 JSON.stringify 来重用缓存 let cache = []; JSON.safeStringify = (circ, (key, val) => { if (typeof val === 'object' && val !== null) { //Duplicate reference found, reset key if (cache.includes(val)) return; //Save value in our collection cache.push(val); } return val; }); //cache = null; //Enable garbage collection console.log('cache', JSON.safeStringify(cache));
给定示例中的替换器不是 100% 正确的,这取决于我们对“重复”的定义。
在这种情况下,一个值被丢弃,但它使用自定义替换器,并跟踪解析的对象值:
let a = { b: 1 } let opt = {}; opt.one = a; opt.two = a; //one和two指向同一个对象,但两个被丢弃:JSON.stringify(opt,…); //作为ES6中编写的实用函数,请使用以下命令: //安全地处理循环引用 JSON.safeStringify = (obj, indent = 2) => { let cache = []; const retVal = JSON.stringify( obj, (key, val) => typeof val === "object" && val !== null ? cache.includes(val) ? undefined //找到重复的引用重置键 : cache.push(val) && val //Store value in our collection : val, indent ); cache = null; return retVal; }; console.log('options', JSON.safeStringify(opt));
日期:2020-06-02 22:16:23 来源:oir作者:oir