У меня есть 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? Я все еще новичок в Джексоне и не знаю, как это решить.
Просто любопытно и надеется узнать что-то: какова цель класса Builder? – dnault
Я хочу, чтобы объекты «Packet» могли быть построены с использованием JSON или программно, поэтому класс EDIT Builder: те же рассуждения для объекта «Response» – yiwei
Прохладный, не знал, что Джексон поддерживает шаблон строителя. – dnault