2012-07-28 13 views
35

के साथ जैक्सन JSON Deserialization मुझे जैक्सन के साथ एक सवाल है कि मुझे लगता है कि हल करने के लिए सरल होना चाहिए, लेकिन यह मुझे मार रहा है।रूट एलिमेंट

चलो कहते हैं कि मैं एक जावा POJO वर्ग है कि इस तरह दिखता है (मेरे लिए getters और setters मान) करते हैं:

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

और मैं JSON है कि एक उपयोगकर्ता वस्तु में इस तरह दिखता है deserialize हैं:

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

जैक्सन मुझे समस्याएं दे रहा है क्योंकि उपयोगकर्ता जेएसओएन में पहली स्तर की वस्तु नहीं है। मैं स्पष्ट रूप से UserWrapper क्लास बना सकता हूं जिसमें एक एकल उपयोगकर्ता ऑब्जेक्ट है और फिर इसका उपयोग करके deserialize है, लेकिन मुझे पता है कि एक और अधिक सुरुचिपूर्ण समाधान होना चाहिए।

मुझे यह कैसे करना चाहिए?

उत्तर

53

संपादित करें: इस समाधान केवल जैक्सन के लिए काम करता < 2,0

अपने मामले के लिए वहाँ एक सरल उपाय है:

  • आप @JsonRootName(value = "user") के साथ अपने मॉडल वर्ग टिप्पणी करने की जरूरत है;
  • आपको अपने मैपर को om.configure(Feature.UNWRAP_ROOT_VALUE, true); (1.9 के लिए) और om.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); (संस्करण 2 के लिए) के साथ कॉन्फ़िगर करने की आवश्यकता है।

यही है!


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

इस प्रिंट होगा:

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

धन्यवाद! मुझे पता था कि एक एनोटेशन होना था, मैं इसे अपने Google-Fu के साथ दिखाने के लिए नहीं मिला। –

+1

आपका स्वागत है! ;) –

+3

भविष्य में इस पृष्ठ पर आने वाले किसी भी व्यक्ति के लिए, मुझे यह ध्यान रखना होगा कि यह केवल जैक्सन <2.0 के साथ काम करता है (जब यह कोडहॉस था, इसे FasterXML में माइग्रेट करने से पहले)। मुझे FasterXML पैकेज में UNWRAP_ROOT_VALUE नहीं मिल रहा है। –

संबंधित मुद्दे