2012-07-28 19 views
35

Ben Jackson ile çözmek için basit olması gerektiğini düşünüyorum bir soru yaşıyorum, ama beni öldürüyor.Kök Elemanı ile Jackson JSON Deserialization

ı şöyle bir java POJO sınıf var demek (benim için Alıcılar ve ayarlayıcılar varsayalım) yapalım:

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

Ve ben bir kullanıcı nesnesine şöyle JSON serisini istiyorum:

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

Kullanıcı, JSON'ta birinci düzey nesne olmadığı için Jackson bana sorun veriyor. Belli bir User nesnesine sahip bir UserWrapper sınıfı yapabilirdim ve bunu kullanarak seri hale getirebilirdim ama daha zarif bir çözüm olması gerektiğini biliyorum.

Bunu nasıl yapmalıyım?

cevap

53

düzenleme: Bu çözüm yalnızca jackson için çalışır < davanızı için 2.0

basit bir çözüm yolu şudur: @JsonRootName(value = "user") ile model sınıf açıklama gerekiyor

  • ;
  • Eşleştiricinizi om.configure(Feature.UNWRAP_ROOT_VALUE, true); (1.9 için olduğu gibi) ve om.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); (sürüm 2 için) ile yapılandırmanız gerekir.

That's it!


@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)); 

bu yazdırır:

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

teşekkür ederiz! Bir açıklama olması gerektiğini biliyordum, bunu Google-Fu'mla göstermek için alamadım. –

+1

size bekliyoruz! ;) –

+3

Gelecekte bu sayfaya gelen herkes için, bunun sadece Jackson <2.0 ile çalıştığını belirtmek isterim (Codehaus olduğunda, FasterXML'ye taşınmadan önce). FasterXML Paketinde UNWRAP_ROOT_VALUE öğesini bulamıyorum. –