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

如何在循环引用中使用@JsonIdentityInfo?

顾高翰
2023-03-14
问题内容

我试图描述使用@JsonIdentityInfo杰克逊2
这里。

为了进行测试,我创建了以下两个类:

public class A
{
    private B b;
    // constructor(s) and getter/setter omitted
}
public class B
{
    private A a;
    // see above
}

当然,幼稚的方法会失败:

@Test
public void testJacksonJr() throws Exception
{
    A a = new A();
    B b = new B(a);
    a.setB(b);
    String s = JSON.std.asString(a);// throws StackOverflowError
    Assert.assertEquals("{\"@id\":1,\"b\":{\"@id\":2,\"a\":1}}", s);
}

添加@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id")到A类和/或B类也不起作用。

我希望我可以序列化(然后反序列化)a为这样的东西:(尽管对JSON不太确定)

{
    "b": {
        "@id": 1,
        "a": {
            "@id": 2,
            "b": 1
        }
    }
}

我怎样才能做到这一点?


问题答案:

似乎jackson-jr具有Jackson功能的一部分。@JsonIdentityInfo一定没有切入。

如果可以使用完整的Jackson库,则只需对问题中建议ObjectMapper@JsonIdentityInfo注释使用标准并序列化对象即可。例如

@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id")
public class A {/* all that good stuff */}

@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id")
public class B {/* all that good stuff */}

然后

A a = new A();
B b = new B(a);
a.setB(b);
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(a));

会产生

{
    "@id": 1,
    "b": {
        "@id": 2,
        "a": 1
    }
}

其中嵌套a是通过引用根对象@id



 类似资料:
  • 问题内容: 有时在我的应用程序中打招呼,逻辑迫使我使用循环引用,我想知道如何在春季启用此配置? 问题答案: 看一下这篇文章。 我会从那里的第一个选择中提出建议。循环依赖不是一个好兆头,应该避免。例如,您可以创建第三个辅助类。 其他两个选项是解决方法,以后将很难理解和调试。

  • 我希望我可以序列化(稍后反序列化)为如下所示:(但对JSON不太确定) 我怎么能那样做?

  • 问题内容: 我想在本地保存具有循环引用的对象。我有什么选择? 我的第一个想法是使用HTML5本地存储,但是由于循环引用,我无法对该对象进行字符串化。 具体来说,我正在尝试保存当前选择的DOMSelection对象。 例: 我现在可以使字符串化工作的唯一方法是忽略某些对象,如下所示: 但这给我留下了一个相当空的DOMSelection对象,不足以满足我的需要。 还有其他方法可以保存该对象吗?唯一的要

  • 下面是我的父组件,它包含一个循环的多个输入。如何选择一个来聚焦?在这种情况下,我必须创建动态吗?

  • 问题内容: 有没有我可以用来遍历数组并具有索引和元素的函数,例如Python的枚举? 问题答案: 是。从Swift 3.0开始,如果需要每个元素的索引及其值,则可以使用该方法遍历数组。它返回由索引和数组中每个项目的值组成的对对的序列。例如: 在Swift 3.0之前和Swift 2.0之后,该函数称为: 在Swift 2.0之前,它是全局函数。

  • 问题内容: 我有下表: 存储在其中的实体是按层次结构组织的:如果存在一行,则认为该行是任何内容的“子项” 。由于项目不能从其自身衍生而来,因此我想将存在循环层次序列的行为定为非法: 我该怎么做呢? 另外,我可以在表中添加一个表示层次结构中“级别”的字段: 然后,我要求将其设置为when ,否则。 我正在使用SQL Server 2008 R2。 问题答案: 为了检查循环引用,我使用了触发器和递归C