gpt4 book ai didi

java - 如何将@JsonIdentityInfo 与循环引用一起使用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:09:42 26 4
gpt4 key购买 nike

我正在尝试使用来自 Jackson 2 的 @JsonIdentityInfo,如所述 here .

出于测试目的,我创建了以下两个类:

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 库,只需使用带有您在问题中建议的 @JsonIdentityInfo 注释的标准 ObjectMapper 并序列化您的对象。例如

@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 引用根对象。

关于java - 如何将@JsonIdentityInfo 与循环引用一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37302816/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com