如何使用Jackson反序列化对象变量?

时间:2015-11-18 21:09:14

标签: java jackson

我有一个Packet类,它可以序列化和反序列化:

@JsonDeserialize(builder = Packet.Builder.class)
public final class Packet {
    // Constructors, getters, etc
    // ...
    public static final class Builder {
        // Builder variables...
        // ...

        @JsonProperty("value_date")
        public Builder valueDate(String val) {
            valueDate = val;
            return this;
        }

        @JsonProperty("generation_date")
        public Builder generationTimeStamp(String val) {
            generationTimeStamp = val;
            return this;
        }

        public Packet build() { return new Packet(this); }
    }

我还有一个PacketResponse对象,如下所示:

@JsonDeserialize(builder = PacketResponse.Builder.class)
public final class PacketResponse {

    // Packet and response message
    private final String message;
    private final Packet packet;

    // Constructors, getters, etc
    // ...

    public static final class Builder {

        private Packet packet;
        private String message;

        private Builder() {}

        @JsonProperty("packet")
        public Builder packet(Packet val) {
            packet = val;
            return this;
        }

        @JsonProperty("message")
        public Builder message(String val) {
            message = val;
            return this;
        }

        public PacketResponse build() {
            return new PacketResponse(this);
        }
    }

PacketResponse对象的序列化工作正常,结果为:

{
    "message": "the quick brown fox",
    "packet": {
        "valueDate": "2015-10-24",
        "generationTimeStamp": "2015-11-12T20:45:24+0000"
    }
}

但是,当我尝试将此JSON反序列化为PacketResponse对象时,使用

new ObjectMapper().readValue(json, PacketResponse.class);

我得到Unrecognized field "valueDate" (class com.m.Packet$Builder), not marked as ignorable

似乎它正在尝试反序列化Packet,但因为它没有直接执行,杰克逊无法看到@JsonProperty("value_date")注释而是正在寻找valueDate字段(因为它是构建器方法的名称)。

任何人都可以帮我找出反序列化JSON的正确方法吗?我还是杰克逊的新手,并且真的不知道如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

JSON包含“valueDate”,但@JsonProperty注释指定“value_date”(带下划线)。

注释中的“generation_date”与JSON中的“generationTimeStamp”相同。