如何链接对象使用现有的id与Jackson注释?

时间:2017-07-20 14:57:20

标签: java json jackson

我有一个数据结构(不是我设计的,所以没有机会改变它!)。其中一个类(例如foo)包含其他类(例如bar),而bar包含数组foo。我以这种方式使用@JsonIdentityInfo解决了这个问题:

@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "object.id" )
public class Foo {
   @JsonProperty
   Object id;
   @JsonProperty
   Bar bar;
}

@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "object.id" )
public class Bar{
   @JsonProperty
   Object id;
   @JsonProperty
   List<Foo> foos;
}

这适当地反序列化,但序列化不完全正确。问题是这会产生额外的ID object.id。我想将ID用作object.id。如何使用杰克逊注释实现这一目标?

我想解析一个序列化:

Object Foo:

{
   "id":1,
   "bar":
      {
        "id":2,
        "foos":[1]
      } 
}

而不是这个:

{
   "id":1,
   "object.id":2,
   "bar":
      {
        "id":2,
        "object.id":2,
        "foos":[1]
      } 
}

1 个答案:

答案 0 :(得分:0)

解决方案是在注释配置ObjectIdGenerators.PropertyGenerator.class中使用ObjectIdGenerators.IntSequenceGenerator.class代替@JsonIdentityInfo。另外,必须如下所示配置范围:

 @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope = Foo.class)
    public class Foo {
       @JsonProperty
       Object id;
       @JsonProperty
       Bar bar;
    }

   @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope = Bar.class)
    public class Bar{
       @JsonProperty
       Object id;
       @JsonProperty
       List<Foo> foos;
    }

我从Deserialize with Jackson with reference to an existing object

得到答案