【问题标题】:Jackson custom deserializer of multiple properties into value object classJackson将多个属性的自定义反序列化器转换为值对象类
【发布时间】:2018-06-18 15:22:25
【问题描述】:

假设我有以下平面 JSON 结构:

{
    "name": "name",
    "validFrom": "2018-01-09",
    "validTo": "2018-01-10",
}

MyPojo类:

public class MyPojo {
    private String name;

    @JsonUnwrapped
    private Validity validity;
}

Validity 类:

public class Validity {
    private LocalDate validFrom;
    private LocalDate validTo;
}

我创建了自定义展开序列化程序,它工作正常。

我想将上面的 JSON 反序列化为 MyPojo 类,其中包括 Validity 值对象。

Validity 的自定义反序列化器应该如何实现?

@JsonProperty 不起作用,因为我想将 2 个 Json 属性用于 Validity 构造

【问题讨论】:

    标签: java json jackson deserialization json-deserialization


    【解决方案1】:

    在这种情况下,我会推荐一个构造函数,比自定义反序列化器简单得多,例如:

    @JsonCreator
    public MyPojo(@JsonProperty("name") String name,
                  @JsonProperty("validFrom") String validFrom,
                  @JsonProperty("validTo") String validTo) {
        this.name = name;
        this.validity = new Validity(validFrom, validTo);
    }
    

    暗示LocalDate 是从上面的String 解析出来的,但您可能让Jackson 解析它们。

    如果您使用带有parameter names module 的Java 8,您可以跳过上面的注释

    这将需要额外的有效性注释,请参阅打开的 Jackson 问题 here

    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    @JsonUnwrapped
    private Validity validity;
    

    【讨论】:

    • 如果我想要构造函数 MyPojo(字符串名称,有效性有效性)怎么办?有可能吗?
    • 抛出:InvalidDefinitionException: Cannot define Creator property "validity" as @JsonUnwrapped: combination not yet supported
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 2017-09-17
    • 2012-08-19
    • 1970-01-01
    • 2016-06-20
    相关资源
    最近更新 更多