杰克逊JSON双向对象参考

Mic*_*elB 2 java jackson

我有一对像

public class Obj1 {
    public int id;
    public String name;
    public Obj2 obj2;
}

public class Obj2 {
    public int id;
    public String name;
    public List<Obj1> obj1list;
}
Run Code Online (Sandbox Code Playgroud)

我希望能够通过Jackson将其转换为Json。我找到了JsonManagedReferenceJsonBackReference并为它们添加了注释,但是当您这样做时,序列化仅以一种方式起作用。仅当JsonManagedReference侧面的类被序列化时才显示。

如果我序列化一个“ Obj1”,我想查看附加到它的“ Obj2”。如果我序列化“ Obj2”,我想查看附加到它的“ Obj1”列表。

我也试过像这样使用JsonIdentityInfo批注

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
Run Code Online (Sandbox Code Playgroud)

除了将父对象的“ id”值添加到子对象(或列表案例中的每个子对象)之外,这似乎很有效,这有点奇怪。虽然我想我可以忍受。

有没有办法让它表现出我所期望的?

Ami*_*mar 5

您正在查看@JsonIgnoreProperties,它将给出所需的内容,并避免json递归。

public class Obj1 {
    public int id;
    public String name;
    @JsonIgnoreProperties("obj1list")
    public Obj2 obj2;
}

public class Obj2 {
    public int id;
    public String name;
    @JsonIgnoreProperties("obj2")
    public List<Obj1> obj1list;
}
Run Code Online (Sandbox Code Playgroud)


UPDATE

我总是perfers @JsonIgnorePropertiesJsonBackReferenceJsonManagedReference。这样做不仅可以解决问题,而且还可以避免任何数据序列化(在这里需要这样做)。

我在github上也有一个处理这种情况的示例项目。查找实体类代码School.javaDistrict.java。如果您想运行测试,则其为mvn spring-boot可执行代码。

从Javadoc开始,从Jackson 2.0开始,@JsonIgnoreProperties注释既可以应用于类,也可以应用于属性。如果将两者同时使用,则实际集合将是所有无义对象的并集:也就是说,您只能添加要忽略的属性,而不能删除或覆盖。因此,您不能删除按属性标注忽略的属性。


它是如何工作

当你定义@JsonIgnoreProperties在欢迎使用属性的水平,而序列化/ deserization它将refered属性对象上工作。

因此,在这里,在Obj1解析时,您要求解析器忽略的obj1list属性obj2。同样,在解析时Obj2,它将忽略集合中包含的obj2引用Obj。因此,您的解析如下所示:

Obj1 : {
    id : int,
    name : string,
    Obj2 : {
     id : int,
     name : string
     obj1list : //ignored avoids recursion
    }
}

Obj2 : {
    id : int,
    name : string,
    obj1list : [{
     id : int,
     name : string,
     obj2 : //ignored avoids recursion
    },
    {
     id : int,
     name : string
     obj2 : //ignored avoids recursion
    }
    ]
}
Run Code Online (Sandbox Code Playgroud)