2011-11-24 17 views
9

मैं एक JSON फ़ाइल है कि इस तरह दिखता है:जैक्सन में किसी सरणी से शुरू होने वाली JSON फ़ाइल को deserialize कैसे करें?

public class Objects{ 

    public Collection<List> myObject; 
} 

मैं ObjectMapper का उपयोग कर JSON deserialize करना चाहते हैं:

[ 
    { "field":"val" }, 
.... 
] 

मैं जावा वस्तु एक वस्तु और उनमें से संग्रह का प्रतिनिधित्व किया है।

ObjectMapper mapper = new ObjectMapper(); 
mapper.readValue(in, Objects.class); 

लेकिन मैं मिलता है:

11-24 23:19:19.828: W/UpdateService(6084): org.codehaus.jackson.map.JsonMappingException: 
Can not deserialize instance of com.project.my.Objects out of START_ARRAY token 

उत्तर

20

प्रयास करें

mapper.readValue(in, ObjectClass[].class); 

कहाँ क्लास है की तरह कुछ:

public class ObjectClass { 
    String field; 

    public ObjectClass() { } 

    public void setField(String value) { 
     this.field = value; 
    } 
    } 

नोट: Objects वर्ग के अपने पोस्ट संस्करण में, तुम डी हो सूची संग्रह का संग्रह (यानी। सूचियों की एक सूची), जो आप नहीं चाहते हैं। आप शायद List<ObjectClass> चाहते थे। हालांकि, जैक्सन के साथ deserializing, और फिर बाद में एक सूची में परिवर्तित करते समय YourObject[].class करने के लिए यह बहुत आसान है।

0

एक सरणी या सूची प्रकार के कामों को पास करना, जैसा कि @dmon ने उत्तर दिया था।

पूर्णता के लिए के लिए, वहाँ भी एक वृद्धिशील दृष्टिकोण यदि आप सामग्री पढ़ने की एक-एक करके चाहता था है:

Iterator<Objects> it = mapper.reader(Objects.class).readValues(in); 
while (it.hasNext()) { 
    Objects next = it.next(); 
    // ... process it 
} 

यह उपयोगी है अगर आप बड़ी सूची या वस्तुओं के दृश्यों है; या तो जेएसओएन ऐरे को संलग्न करने के साथ, या रिक्त स्थान या लाइनफ़ीड्स से अलग रूट-स्तर मान।

4

आप सीधे निम्नलिखित तरीके के माध्यम से एक सूची प्राप्त कर सकते हैं:

List<ObjectClass> objs = 
    mapper.readValue(in, new TypeReference<List<ObjectClass>>() {}); 
संबंधित मुद्दे