【问题标题】:Jackson serialising Optional with null value for YAML杰克逊序列化可选,YAML 值为空
【发布时间】:2020-08-25 16:00:26
【问题描述】:

目前我正在使用YAMLFactory 配置ObjectMapper 以序列化和反序列化Pojos <=> YAML,但是尽管尝试了Jackson 中的常用技巧,但它在序列化中写入null 值。

在类级别或字段级别使用@JsonInclude(JsonInclude.Include.NON_NULL) 进行注释没有影响。我也尝试用@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) 注释类,也没有任何影响。使用YAMLFactory 时如何实现这一点?

我找到了类似的question,但用例似乎不一样。为了清楚起见,我试图完全省略该字段。

编辑:这是一个例子(我也在使用Lombok

@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class QueueProperties extends Properties {

    @JsonProperty("QueueName")
    private String queueName;

    @JsonProperty("RedrivePolicy")
    private RedrivePolicy redrivePolicy;

    public Optional<RedrivePolicy> getRedrivePolicy() {
        return Optional.ofNullable(redrivePolicy);
    }
}

序列化时:

Properties:
  QueueName: 471416d1-3643-4d5a-a033-65f22757dcaf-chargeback-paypal-ingestion-ingest_dispute
  RedrivePolicy: null

ObjectMapper 配置:

ObjectMapper mapper = new ObjectMapper(new YAMLFactory().enable(YAMLGenerator.Feature.MINIMIZE_QUOTES));                                                          
mapper.registerModule(new Jdk8Module());

【问题讨论】:

  • 您能否提供一个简单的示例,例如在链接问题中重现您的问题?了解您的情况并帮助解决此问题会容易得多。
  • 添加了 Pojo 及其序列化方式。

标签: java java-8 jackson yaml optional


【解决方案1】:

getRedrivePolicy getter 方法总是返回not-null 对象,即使这样,Optional 也可以引用null。在这种情况下,您应该跳过 empty 对象。 Optionalnull 被认为是空的,我们可以使用 JsonInclude.Include.NON_EMPTY 。您可以将@JsonInclude(JsonInclude.Include.NON_NULL) 保留在班级级别,并仅针对给定的getter 添加NON_EMPTY

@JsonInclude(JsonInclude.Include.NON_EMPTY)
public Optional<Object> getRedrivePolicy() {
    return Optional.ofNullable(redrivePolicy);
}

【讨论】:

  • 我应该注意到 NON_EMPTY 只在 getter 上工作,而不是在类级别上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
  • 2011-08-21
  • 2015-03-13
相关资源
最近更新 更多