当前位置: 首页 > 面试题库 >

序列化包含循环对象值的对象

陆浩博
2023-03-14
问题内容

我有一个对象(解析树),其中包含子节点,这些子节点是对其他节点的引用。

我想使用序列化此对象JSON.stringify(),但是我得到了

TypeError:循环对象值

因为我提到的结构。

我该如何解决?对我而言,在序列化对象中是否表示对其他节点的引用并不重要。

另一方面,在创建对象时从对象中删除这些属性似乎很乏味,我也不想对解析器(水仙)进行更改。


问题答案:

使用的第二个参数stringify,该替代品的功能,以排除已序列化对象:

var seen = [];

JSON.stringify(obj, function(key, val) {
   if (val != null && typeof val == "object") {
        if (seen.indexOf(val) >= 0) {
            return;
        }
        seen.push(val);
    }
    return val;
});

http://jsfiddle.net/mH6cJ/38/

正如在其他注释中正确指出的那样,此代码删除了每个“可见”对象,而不仅仅是“递归”对象。

例如,用于:

a = {x:1};
obj = [a, a];

结果将不正确。如果您的结构是这样的,则可能要使用Crockford的decycle或此(简单的)函数,该函数只是将递归引用替换为null:

function decycle(obj, stack = []) {

    if (!obj || typeof obj !== 'object')

        return obj;



    if (stack.includes(obj))

        return null;



    let s = stack.concat([obj]);



    return Array.isArray(obj)

        ? obj.map(x => decycle(x, s))

        : Object.fromEntries(

            Object.entries(obj)

                .map(([k, v]) => [k, decycle(v, s)]));

}



//



let a = {b: [1, 2, 3]}

a.b.push(a);



console.log(JSON.stringify(decycle(a)))


 类似资料:
  • 然后是班级选拔: 教材: 因此,我主要创建新用户并将其序列化: 一切都很完美,但如果我这样做: 然后我想序列化对象用户,程序崩溃了。我得到的结果是: JAVA木卫一。NotSerializableException:在java上。木卫一。ObjectOutputStream。java上的WriteObject 0(ObjectOutputStream.java:1183)。木卫一。ObjectOu

  • 问题内容: 顾名思义,我正在尝试将包含一些BufferedImages(包括其他变量,字符串等)的对象保存到文件中。 我发现了这一点: 如何序列化包含BufferedImages的对象 它的工作原理就像一种魅力,但有一点点挫折:如果您的对象仅包含一个图像,它就可以很好地工作。 我一直在努力获取他的解决方案以处理多个图像(理论上应该可以使用),但是每次读入文件时,我都会得到对象,图像数量正确,但只有

  • 我试图用jackson序列化一些数据,这在大多数情况下都很好,但现在我对列表有问题。该列表的类型为 A,它是一个抽象类,可能包含循环依赖项。我不知道如何使用 jackson 序列化这个结构。IdentityInformation和typeInformation的组合似乎无法正常工作。下面是示例代码,它产生了我面临的问题。 我使用的是 Jackson 版本 2.8.3。我错过了什么吗?有没有一个好的

  • 问题内容: 我正在尝试用Java创建一个简单的图像编辑程序。我制作了一个对象,其中包含有关正在编辑的图像的所有信息(一些基本属性,所应用的效果列表,层列表等),我想要一种简单的方法将其保存到磁盘,以便稍后再次打开。 我发现使用Java的defualt 接口可能正是我想要的,我可以将整个对象写到文件中,稍后再读回内存中。但是,包括和不能序列化(其他所有方法都可以)。 我知道可以重写和方法,但我从未这

  • 问题内容: 你好(对不起我的英语) 我正在开发使用Spring SPRING MVC的json前端网站消耗Web服务的Web服务。spring mvc使用JsonIdentityInfo选项进行序列化,因此每个对象仅在json中写入一次,并且每次都使用引用进行写入,例如她使用相同的对象“ component”有2个“ computer”,因此spring将ID设置为第一个组件(“ @compone

  • 我试图调用一个restendpoint,它返回一个pojo对象,如下所示: 以下是电话: 问题是我已经尝试了一些方法,例如忽略 OffsetDateTime 属性或尝试更改该日期的格式,但它会引发此错误: 否则它将返回空:(解决这个问题的好解决方案是什么?