有一个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"的对象。
有一个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"的对象。
如果直接使用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);
7 回答3.7k 阅读✓ 已解决
12 回答5.5k 阅读✓ 已解决
16 回答5.9k 阅读
9 回答3.8k 阅读
7 回答4.3k 阅读✓ 已解决
10 回答3.4k 阅读
1 回答1.7k 阅读✓ 已解决
JSON.stringify 语法如下:
第二个参数是 replacer。如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理;如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中;如果该参数为 null 或者未提供,则对象所有的属性都会被序列化。
用法如下:
具体说明见 JSON.stringify 用法