Jackson 序列化 YAML 的空值可选

Jackson serialising Optional with null value for YAML

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

在 class 级别或字段级别上使用 @JsonInclude(JsonInclude.Include.NON_NULL) 注释没有影响。我也试过用 @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) 注释 classes 也没有影响。使用 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());

getRedrivePolicygetter方法总是returnsnot-null对象,即便如此,Optional可以引用null。在这种情况下,您应该跳过 empty 个对象。 Optionalnull 被认为是空的,我们可以使用 JsonInclude.Include.NON_EMPTY 作为它。您可以将 @JsonInclude(JsonInclude.Include.NON_NULL) 保持在 class 级别,并仅针对给定的 getter:

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