【问题标题】:Jackson serialization ignore negative valuesJackson 序列化忽略负值
【发布时间】:2019-10-22 22:03:18
【问题描述】:

我有一个这样的对象:

public class MyObject {
    private String name;
    private int number;
    // ...
}

而且我只想在值不是负数 (number >= 0) 时才包含 number

在研究过程中,我发现了 Jackson serialization: ignore empty values (or null)Jackson serialization: Ignore uninitialised int。两者都使用带有Include.NON_NULLInclude.NON_EMPTYInclude.NON_DEFAULT@JsonInclude 注释,但它们都不适合我的问题。

我可以以某种方式使用@JsonInclude 和我的条件number >= 0 来仅包含非负值的值吗?或者有其他解决方案可以实现吗?

【问题讨论】:

  • 正如您通常将对象 jackson 转换为另一个对象(这是外部数据和将外部数据转换为您自己的数据结构以便在您的业务逻辑中不依赖它们的良好做法)我建议您在转换过程中实现概述的逻辑,因为杰克逊不应该用于实现特定于您的应用程序的逻辑,从而实现您的业务逻辑。您可能能够实现这一点,但随后您将特定于应用程序的逻辑耦合到您的 json 映射器。

标签: java json serialization jackson


【解决方案1】:

如果您使用 Jackson 2.9+ 版本,您可以尝试使用 Include.Custom 值作为 @JsonInclude
来自the JsonInclude.CUSTOM specification

表示单独的 filter 对象的值(由 JsonInclude.valueFilter() 代表价值本身,和/或 JsonInclude.contentFilter() 用于结构化类型的内容)将是 用于确定纳入标准。过滤对象的 equals() 用值调用方法进行序列化;如果它返回真值是 排除(即过滤掉);如果 false 值是包括

这是一种比定义自定义序列化程序更具体和声明性的方法。

@JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = PositiveIntegerFilter.class)
private int number;

// ...
public class PositiveIntegerFilter {
    @Override
    public boolean equals(Object other) {
       // Trick required to be compliant with the Jackson Custom attribute processing 
       if (other == null) {
          return true;
       }
       int value = (Integer)other;
       return value < 0;
    }
}

它与objectsand 原语一起使用,并将原语装箱到filter.equals() 方法中的包装器中。

【讨论】:

    猜你喜欢
    • 2013-04-11
    • 2023-04-11
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 2012-02-01
    • 2015-01-12
    • 2016-11-21
    相关资源
    最近更新 更多