2012-07-28 19 views
35

Mam pytanie z Jacksonem, które moim zdaniem powinno być proste do rozwiązania, ale to mnie zabija.Deserializacja Jacksona JSON z Elementem Korzenia

Powiedzmy mam java klasy POJO, który wygląda tak (zakładając pobierające i ustawiające dla mnie):

class User { 
    private String name; 
    private Integer age; 
} 

I chcę deserializować JSON, który wygląda tak do obiektu użytkownika:

{ 
    "user": 
    { 
     "name":"Sam Smith", 
     "age":1 
    } 
} 

Jackson daje mi problemy, ponieważ użytkownik nie jest obiektem pierwszego poziomu w JSON. Oczywiście mogłem utworzyć klasę UserWrapper, która ma pojedynczy obiekt User, a następnie przekształcić ją w deserializację, ale wiem, że musi istnieć bardziej eleganckie rozwiązanie.

Jak powinienem to zrobić?

Odpowiedz

53

edit: to rozwiązanie działa tylko dla Jacksona < 2,0

Twoim przypadku istnieje proste rozwiązanie:

  • trzeba opisywać swoją klasę modelu z @JsonRootName(value = "user");
  • Musisz skonfigurować program odwzorowujący za pomocą om.configure(Feature.UNWRAP_ROOT_VALUE, true); (jak dla wersji 1.9) i om.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); (dla wersji 2).

To wszystko!


@JsonRootName(value = "user") 
public static class User { 
    private String name; 
    private Integer age; 

    public String getName() { 
     return name; 
    } 

    public void setName(final String name) { 
     this.name = name; 
    } 

    public Integer getAge() { 
     return age; 
    } 

    public void setAge(final Integer age) { 
     this.age = age; 
    } 

    @Override 
    public String toString() { 
     return "User [name=" + name + ", age=" + age + "]"; 
    } 

} 

ObjectMapper om = new ObjectMapper(); 
om.configure(Feature.UNWRAP_ROOT_VALUE, true); 
System.out.println(om.readValue("{ \"user\": {  \"name\":\"Sam Smith\",  \"age\":1 }}", User.class)); 

to wypisze:

User [name=Sam Smith, age=1] 
+0

Dziękujemy! Wiedziałem, że musi istnieć adnotacja, której nie mogłem pokazać w Google-Fu. –

+1

serdecznie zapraszamy! ;) –

+3

Dla każdego, kto przyjdzie na tę stronę w przyszłości, chciałbym zauważyć, że działa to tylko z Jacksonem <2.0 (gdy był Codehaus, zanim został przeniesiony do FasterXML). Nie mogę znaleźć UNWRAP_ROOT_VALUE w pakiecie FasterXML. –

Powiązane problemy