JSON.stringify() 方法

JSON.stringify() 方法用于将 JavaScript 对象或者值转换为 JSON 格式,如果指定了替换函数,则可选择替换值,或者如果指定了替换数组,则可选择仅包含指定的属性。

Replacer 是一个修改字符串化过程行为的函数,或者一个字符串和数字对象的数组。

如果 replacer 的值为 null 或者未给出,则所有对象的属性都包含在结果 JSON 字符串中。

如何以类似 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