Jackson JSON序列化,通过级别定义的递归避免

我使用Jackson库将我的pojo对象序列化为JSON表示。 例如,我有A类和B类:

 class A { private int id; private B b; constructors... getters and setters } class B { private int ind; private A a; constructors... getters and setters } 

如果我想序列化来自A类的对象,则在序列化时有可能获得递归。 我知道我可以通过使用@JsonIgnore来阻止它。

是否可以按深度级别限制序列化?

例如,如果级别为2,则序列化将采用以下方式:

  • 序列化a,level = 0(0 序列化
  • 序列化ab,level = 1(1 序列化
  • 序列化aba,level = 2(2 停止

提前致谢。

检查以下链接,它可能会有所帮助:

之后唯一的选择是创建自己的自定义模块,用于对象类型的序列化/反序列化。 看这里:

问候。

我最近遇到了类似的问题:Jackson – 具有双向关系的实体的序列化 (避免循环)

因此解决方案是升级到Jackson 2.0,并向类中添加以下注释:

 @JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "@id") public class SomeEntityClass ... 

这非常有效。

不支持基于等级的忽视。

但是你可以让jackson用2.0来处理循环引用,例如参见“ Jackson 2.0发布 ”以解释如何使用@JsonIdentityInfo

对于深度序列化,您可以参考此处的示例https://github.com/abid-khan/depth-wise-json-serializer

如果你想将自己限制在一个级别(即:你去当前对象的子级而不是进一步),有一个简单的@JsonView解决方案。

在每个作为另一个对象链接的字段上,使用当前类作为视图对其进行注释:

 class A { private int id; @JsonView(A.class) private B b; constructors... getters and setters } class B { private int ind; @JsonView(B.class) private A a; constructors... getters and setters } 

然后,在序列化时,使用对象类作为视图。 序列化A的实例将呈现类似的内容:

 { id: 42, b: { id: 813 } } 

确保将DEFAULT_VIEW_INCLUSION设置为true,否则将不会呈现没有@JsonView注释的字段。 或者,您可以使用Object类或任何常见的超类使用@JsonView注释所有其他字段:

 class A { @JsonView(Object.class) private int id; @JsonView(A.class) private B b; constructors... getters and setters } 

在某些情况下,您可以使用保持最大深度的线程局部整数来限制序列化深度。 看到这个答案 。

经过几个月和大量的研究,我已经实现了自己的解决方案,以保持我的域清除jackson依赖。

 public class Parent { private Child child; public Child getChild(){return child;} public void setChild(Child child){this.child=child;} } public class Child { private Parent parent; public Child getParent(){return parent;} public void setParent(Parent parent){this.parent=parent;} } 

首先,您必须声明双向关系的每个实体,如下所示:

 public interface BidirectionalDefinition { @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id", scope=Parent.class) public interface ParentDef{}; @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id", scope=Child.class) public interface ChildDef{}; } 

之后,可以自动配置对象映射器:

 ObjectMapper om = new ObjectMapper(); Class[] definitions = BidirectionalDefinition.class.getDeclaredClasses(); for (Class definition : definitions) { om.addMixInAnnotations(definition.getAnnotation(JsonIdentityInfo.class).scope(), definition); }