调用JSON.stringify序列化json对象时,如何根据传入的属性名参数解决循环引用问题?

有一个json对象A,对象A属性有一个名叫B属性的json类型对象,B也是一个json对象中,有一个C属性,指向的是A对象。相当于A中有B,B中有A,只不过B在A里叫B,A在B里叫C

要调用JSON.stringify(A),会出现循环引用异常,那么,我能不能传入一个字符串参数,参数内容是"C"。序列化json对象时,忽略掉属性名为"C"的对象。

阅读 1.4k
2 个回答

JSON.stringify 语法如下:

JSON.stringify(value[, replacer [, space]])

第二个参数是 replacer。如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理;如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中;如果该参数为 null 或者未提供,则对象所有的属性都会被序列化。

用法如下:

a = {b:1,c:1}

JSON.stringify(a, (key,value)=>key !== 'c' ? value : undefined)
// 打印结果 {"b":1}

具体说明见 JSON.stringify 用法

如果直接使用JSON.stringify()来进行序列化,则此问题无解(无法通过一个程序来应对所有循环引用的问题)。但可以自己编写序列化方法,在对有循环引用结构的对象进行序列化的过程中,新建一个缓存用于存储所有已被序列化的各种子对象。在序列化这一递归过程中,若遇某个对象值已经在缓存中出现过,则忽略此对象,并以某种引用指针代替。

关于JavaScript序列化过程中的循环引用结构,以及内置类型和内置对象(如Date、RegExp),我写了个小工具ESSerializer(https://www.npmjs.com/package...),可以在序列化和反序列化过程中保留大多数内置类型/对象,同时保留自定义类、继承等各种面向对象属性,支持循环引用结构。

用法如下:

const ESSerializer = require('esserializer');
const serializedString = ESSerializer.serialize(obj);
const deserializedObj = ESSerializer.deserialize(serializedString);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏