14

我正在尝试使用 Jackson 2 中的@JsonIdentityInfo,如此处所述

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

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
        }
    }
}

我怎样才能做到这一点?

4

3 回答 3

24

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
    }
}

其中nesteda通过它的 . 引用根对象@id

于 2016-05-18T15:24:15.267 回答
3

有几种方法可以解决这种循环引用或无限递归问题。这个链接详细解释了每一个。我已经解决了我的问题,包括每个相关实体上方的 @JsonIdentityInfo 注释,尽管 @JsonView 是更新的,并且根据您的风景可能是一个更好的解决方案。

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")

或者使用 IntSequenceGenerator 实现:

@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class)
@Entity
public class A implements Serializable 
...
于 2018-05-03T02:43:11.613 回答
-1

在某些情况下,可能需要使用@JsonProperty("id")注释Id 属性

例如,就我而言,这使我的应用程序正常运行。

于 2018-02-25T11:06:33.087 回答