【问题标题】:How do I make jackson not serialize primitives with default value如何使杰克逊不序列化具有默认值的基元
【发布时间】:2013-01-21 08:15:35
【问题描述】:

在 Jackson 中,可以在 POJO 上使用 JsonSerialize 注释以防止空对象被序列化 (@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL))。但是,基元不能设置为 null,因此此注释不适用于诸如未触及且默认为 0 的 int 之类的东西。

是否有一个注释可以让我说“对于这个类,不要序列化基元,除非它们不同于它们的默认值”或“对于这个字段,如果它的值为 X,不要序列化它“?

【问题讨论】:

  • 您是否考虑过使用自定义序列化程序?不确定它如何与原语一起使用,但至少看看它。
  • 那是我不希望听到的答案 =)。到目前为止,使用 vanilla 设置和 JsonProperty、JsonIgnore 和 JsonFilter 注释,一切都运行良好。不过我会检查一下,谢谢。

标签: java json jackson


【解决方案1】:

如果您使用的是最新版本的 Jackson,您可以使用 JsonInclude.Include.NON_DEFAULT,它应该适用于原语。

这种方法的缺点是,将 bean 属性设置为其默认值将不起作用,并且该属性仍然不会被包含:

@JsonInclude(Include.NON_DEFAULT)
public class Bean {
  private int val;
  public int getVal() { return val; }
  public void setVal(int val) { this.val = val; }
}

Bean b = new Bean();
b.setVal(0);
new ObjectMapper().writeValueAsString(b); // "{}" 

【讨论】:

  • 这正是我想要的!我的版本需要多长时间?
  • 检查JsonSerialize.InclusionJsonInclude.Include(如果使用Jackson 2.x)枚举的NON_DEFAULT 选项,它的存在时间似乎比我想象的要长
【解决方案2】:

事实是,在 Java 中,类加载器会将所有未初始化的原始属性(int = 0,boolean = false 等)设置为默认值,因此您无法将它们与您明确设置的那些区分开来应用程序。在我看来,您有两种选择:

  • 使用相应的包装对象而不是基元(Integer、Boolean、Long..)
  • 如前所述,定义一个自定义序列化程序

【讨论】:

    猜你喜欢
    • 2018-07-21
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多