2012-06-19 26 views
7

मैं डेटा को क्रमबद्ध/deserialize करने के लिए सीएक्सएफ के भीतर जैक्सन का उपयोग कर रहा हूँ। दुर्भाग्य से, मुझे एक JSON सरणी को deserialize करने के लिए सीएक्सएफ/जैक्सन को कॉन्फ़िगर करने में कठिनाई हो रही है। मैं इस मुद्दे को हल करने में मदद की सराहना करता हूं।JSON ऐरे को Deserialize कैसे करें?

इस बिंदु json डेटा के सबसे वस्तु प्रारूप में किया गया है अप करने के लिए

, यानी

{ "objectCollection": [ {...}, {...}, {...}... ] }

हालांकि, विचाराधीन json डेटा फार्म की है:

[ {...}, {...}, {...} ]

वेब सेवा एंडपॉइंट "समूह डीटीओ" ऑब्जेक्ट की अपेक्षा करता है (निम्नलिखित देखें) जिसमें एक ही संपत्ति है - समूह का संग्रह, जो टी के माध्यम से प्रेषित है वह JSON सरणी।

@PATH(...) 
public Response createGroups(GroupsDto groups) { 
... 
} 

मैंने समूह के संग्रह समूह के अनुसार @JsonDeserialize जोड़ा, लेकिन यह काम नहीं करता है। मैं मिलना जारी रहता है: "START_ARRAY टोकन से बाहर GroupsDto के कहने deserialize नहीं कर सकते"

public class GroupsDto { 

     private Collection<GroupDto> groups; 

     /** 
     * @return the groups 
     */ 
     @XmlElement(name="group") 
     @JsonDeserialize(contentAs=GroupDto.class) 
     public Collection<GroupDto> getGroups() { 
       return groups; 
     } 
... 
} 
+0

चेक इस सवाल [जैक्सन - loadDataFromNetwork() विधि का उपयोग कर Robospice के साथ एक JSON सारणी पढ़ने] [1] [1]: http://stackoverflow.com/questions/18792702/jackson-reading- ए-जेसन-एरे-साथ-रोबस्पिस-उपयोग-लोडडाटा फ्रॉमनेटवर्क-विधि – Sneg

उत्तर

0

आप बस अपनी सेटर में @JsonDeserialize(contentAs=GroupDto.class) निर्दिष्ट करने के लिए की जरूरत है। सीरियलाइजेशन हमेशा पर प्राप्त होता है डेसेरियलाइजेशन हमेशा पर सेट होता है, या यदि आप चाहें तो आप दोनों फ़ील्ड को निर्दिष्ट कर सकते हैं।

प्रलेखन Serialize और Deserialize

कोड का नमूना के लिए:

[ {...}, {...}, {...} ] 

आप किसी अन्य वर्ग का कहना है कि 'आवरण' जोड़ने का उपयोग करने के मिल गया: json डेटा फार्म की है

import java.io.IOException; 
import java.util.List; 

import org.codehaus.jackson.JsonGenerationException; 
import org.codehaus.jackson.map.JsonMappingException; 
import org.codehaus.jackson.map.ObjectMapper; 
import org.codehaus.jackson.map.annotate.JsonDeserialize; 

public class JacksonDeserialize { 

    public static class ModelClass { 

     private String name; 

     public ModelClass() { 
     } 

     public String getName() { 
      return name; 
     } 

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

     public ModelClass(final String name) { 
      super(); 
      this.name = name; 
     } 

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

    } 

    public static class ListModelClass { 

     private List<ModelClass> list; 

     @JsonDeserialize(contentAs = ModelClass.class) 
     public void setList(final List<ModelClass> list) { 
      this.list = list; 
     } 

     @Override 
     public String toString() { 
      return "ListModelClass [list=" + list + "]"; 
     } 

    } 

    public static void main(final String[] args) throws JsonGenerationException, JsonMappingException, IOException { 
     ObjectMapper objectMapper = new ObjectMapper(); 
     System.out.println(objectMapper.readValue("{\"list\":[{\"name\":\"name1\"},{\"name\":\"name2\"}]}", 
       ListModelClass.class)); 
    } 

} 
+0

गेटर/सेटर मुद्दे पर हेड-अप के लिए धन्यवाद। मैंने आपके उदाहरण में देखा है कि आप जेसन सरणी यानी "{\" * सूची * \ ": ...} योग्यता प्राप्त कर रहे हैं * योग्यता के बिना * deserialize करना संभव है? यदि हां, तो कैसे? – Ari

+0

कोई योग्यता जारी नहीं है, इस मामले में जादू '@ जेसन डीसेरियलाइज' एनोटेशन द्वारा किया जाता है। संपत्ति 'कंटेंटएएस' यह इंगित करने के लिए है कि यह एक संग्रह है और इसे 'मॉडल क्लास' के रूप में deserialized किया जाएगा। अगर आप चाहते हैं कि आप संपत्ति सूची 'सूची' से बदल सकते हैं कुछ और। कोई फर्क नहीं पड़ता, एनोटेशन क्या मायने रखता है। –

+0

मैं समझता हूं कि विशिष्ट नाम असमान है, लेकिन कोई ऐसा नाम नहीं करता जहां कोई नाम नहीं है? आपके उदाहरण में आप '{ "सूची": [...]} ', जिसमें कुंजी' सूची 'है, लेकिन यदि कोई कुंजी (नाम) नहीं है - यानी '[...]' – Ari

8

हैं:

@JsonIgnoreProperties(ignoreUnknown = true) 
public class ListDto extends ArrayList<GroupDto> { 

    public ListDto() { 
    } 
} 

और deserailizing जबकि इस वर्ग का उपयोग करें। यह दृष्टिकोण मेरे लिए काम किया।