我有一对像
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;
}
我希望能够通过Jackson将其转换为Json。我找到了JsonManagedReference
和JsonBackReference
并为它们添加了注释,但是当您这样做时,序列化仅以一种方式起作用。仅当JsonManagedReference
侧面的类被序列化时才会显示。
如果我序列化一个“ Obj1”,我想查看附加到它的“ Obj2”。如果我序列化“ Obj2”,我想查看附加到它的“ Obj1”列表。
我也试过像这样使用JsonIdentityInfo批注
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
除了将父对象的“ id”值添加到子对象(或列表案例中的每个子对象)之外,这似乎很有效,这有点奇怪。虽然我想我可以忍受。
有没有办法让它表现出我所期望的?
您正在查看@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;
}
UPDATE
我总是perfers @JsonIgnoreProperties
了JsonBackReference
和JsonManagedReference
。这样做不仅可以实现技巧,而且还可以避免任何数据序列化(此处就是这种情况)。
我在github上也有一个处理这种情况的示例项目。查找实体类代码School.java
&District.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
}
]
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句