2015-11-18 4 views
3

У меня есть 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? Я все еще новичок в Джексоне и не знаю, как это решить.

+0

Просто любопытно и надеется узнать что-то: какова цель класса Builder? – dnault

+1

Я хочу, чтобы объекты «Packet» могли быть построены с использованием JSON или программно, поэтому класс EDIT Builder: те же рассуждения для объекта «Response» – yiwei

+0

Прохладный, не знал, что Джексон поддерживает шаблон строителя. – dnault

ответ

1

JSON содержит «valueDate», но аннотация @JsonProperty указывает «value_date» (с подчеркиванием).

Ditto "generation_date" в аннотации по сравнению с "generationTimeStamp" в JSON.

+0

yup, это было так! благодаря! Я добавил '@JsonGetter (" value_date ")' своим получателям в 'Packet' и решил – yiwei

Смежные вопросы