当前位置: 首页 > 面试题库 >

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

轩辕海
2023-03-14
问题内容

我使用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,则序列化将以这种方式进行:

  • 序列化一个,级别= 0(0 <2正常)->序列化
  • 序列化ab,级别= 1(1 <2 ok)->序列化
  • 序列化ABA,级别= 2(2 <2不正确)->停止

提前致谢。


问题答案:

我最近遇到了一个类似的问题:杰克逊-具有双向关系的实体的序列化(避免循环)

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

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

这很完美。



 类似资料:
  • 问题内容: 我使用Jackson库将我的pojo对象序列化为表示形式。例如,我有A类和B类: 如果我要序列化类A中的对象,则有可能在序列化时获得递归。我知道我可以通过使用停止它。 是否可以通过深度级别限制序列化? 例如,如果级别为2,则序列化将以这种方式进行: 序列化一个,级别= 0(0 <2正常)->序列化 序列化ab,级别= 1(1 <2 ok)->序列化 序列化ABA,级别= 2(2 <2不

  • 我正在使用SpringMVC 3.2.4,并希望使用Jackson2将对象序列化为JSON输出。 对象具有递归属性。如果我尝试使用默认的Jackson ObjectMapper序列化它,我会得到一个递归错误。我意识到我可以使用来防止递归,然而,我实际上希望递归能够使在胡子模板中解析更容易。然而,我想限制递归级别。 是否需要指定Jackson序列化程序只递归1级?如果我需要创建自己的序列化程序,我可

  • 我有一个错误: 我一直试图避免导致此被序列化的字段,但错误没有得到纠正。我试图把@JsonIgnore放在任何地方,在getter、setter、属性和所有可能的组合中。 谢啦 - 我无法导入com。谷歌。阿彭金。重新包装。组织。科德豪斯。杰克逊。注释JsonIgnoreProperties说,“使用com.google.appengine.repacked可能会导致你的应用程序在没有警告的情况下

  • Jackson序列化到JSON有一些很好的特性,比如SerializationFeature.write_null_map_values,它允许您避免将null写入序列化对象。 但是,如果我使用自定义的JsonSerializer,这个设置将被忽略,并且我被迫在对WriteStringField的所有调用中进行空检查。例如,我注册了一个自定义的JSONSerializer: 然后在ImportPr

  • 外部化相对于序列化的主要优点是外部化仅保留对象的一部分,而不是序列化时保留整个对象。但我认为,如果我们不调用可序列化类的 writeObject() 方法中的 ObjectOutputStream 的 defaultWriteObject() 方法,我们可以通过自定义序列化来模拟外部化。因此,无需调用 defaultWriteObject() 方法,只在 writeObject() 方法中保留可序

  • 问题内容: 假设我有一个具有列表属性的对象: 我想通过注释为列表定义一个通用的自定义反序列化器: 我正在寻找一种创建“通用”反序列化器的方法- 一种能够对两种类型的列表进行反序列化的方法,类似于ContextualDeserializer,用于使用Jackson将JSON映射到不同类型的地图。 最终目的是实现自定义反序列化逻辑,以将空字符串反序列化为空列表,但是我想了解一种通用方法,而不仅仅是空字