java - Jackson 序列化 可选,YAML 值为空

标签 java java-8 jackson yaml option-type

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

使用 @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 mapper = new ObjectMapper(new YAMLFactory().enable(YAMLGenerator.Feature.MINIMIZE_QUOTES));                                                          
mapper.registerModule(new Jdk8Module());

最佳答案

getRedrivePolicy getter 方法始终返回 not-null 对象,即使如此,Optional 也可以引用 null。在这种情况下,您应该跳过对象。带有 nullOptional 被视为空,我们可以使用 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);
}

关于java - Jackson 序列化 可选,YAML 值为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63582778/

相关文章:

JavaFX 超高清 (4K) 视频

java - 在 NetBeans 中编译任何 JavaFX 项目都会返回 Unsupported major.minor version 52.0

java - 我想等到我的设备完全配对(BLE)

java - 线程 "main"java.lang.NoClassDefFoundError 中出现异常(Maven 项目)

java - 使用 Generic Supplier 抛出未经检查的异常

java - 如何使用 jackson 反序列化带有索引的数组

java - 自定义 Jackson 反序列化器以省略某些对象的映射

java - Jackson XML 映射器强制使用小写 XML 标签

java - 无法在windows上运行java字节码,在mac上编译

java - LWJGL FPS 相机旋转仅限于像素