2010-12-15 10 views
15

मैं नीचे दिए गए JSON को List<Bill>जैक्सन जेसन लाइब्रेरी का उपयोग करके जावा ऑब्जेक्ट को deserialize/मैप करने का प्रयास कर रहा हूं। (इस json जैक्सन, Iam द्वारा उत्पन्न की गई संक्षिप्तता के लिए उस टुकड़े को छोड़ते हुए)जैक्सन जेएसओएन + जावा जेनरिक

{"bills":[{"amount":"13","billId":"billid3"}]} 

यहाँ मेरी रूपांतरण विधि है:

private static void convert(){ 
    String jsonBill = "{\"bills\":[{\"amount\":\"13\",\"billId\":\"billid3\"}]}"; 

    ObjectMapper mapper = new ObjectMapper(); 
    List<Bill> bills = null; 
    try { 
     bills = mapper.readValue(jsonBill, new TypeReference<List<Bill>>() { }); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    System.out.println("bills = " + bills.size()); 
} 

विधेयक इकाई के नीचे है:

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS) 
public class Bill { 
    private String amount; 
    private String billId; 

    public String getBillId() { 
     return billId; 
    } 
    public void setBillId(String billId) { 
     this.billId = billId; 
    } 
    public String getAmount() { 
     return amount; 
    } 
    public void setAmount(String amount) { 
     this.amount = amount; 
    } 
} 

और मैं यह त्रुटि प्राप्त करें:

**org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.util.List out of START_OBJECT token 
at [Source: [email protected]; line: 1, column: 1]** 
at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:160) 
at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:194) 
at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:103) 
at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:93) 
at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:25) 
at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:1980) 
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1278) 
@ModelAttribute("bills") 
@RequestMapping(value = "/", method = RequestMethod.GET) 
public List<Bill> fetchBills() throws IOException { 
    Bill bill = new Bill(); 
    bill.setAmount("13"); 
    bill.setBillId("billid3"); 

    List<Bill> bills = new ArrayList<Bill>(); 
    bills.add(bill); 
    return bills; 
} 

मुझे लगता है मैं कुछ स्पष्ट याद आ रही है .. लेकिन यकीन नहीं क्या यह .. कोई भी विचार है: ४६५१०४०३२१० यहाँ मेरी सरलीकृत spring3 नियंत्रक जो मैं/p json रिटर्न (जैक्सन मानचित्रण के साथ डिफ़ॉल्ट दृश्य के रूप में विन्यस्त) है ?

+0

उपयोग कर रहा हूँ आप billLst सूची के लिए विशेषता 'बिल' मैप करने के लिए यह कह नहीं कर रहे हैं की कोशिश करो। मैंने इसे कभी भी नहीं किया है (स्प्रिंग 3.0 इसे स्वचालित रूप से करता है), लेकिन मैं विशेषता 'बिल' का संदर्भ देखने की अपेक्षा करता हूं। – sioked

+0

हां वह मेरे हिस्से पर एक टाइपो था - मेरी पोस्ट अपडेट की गई। धन्यवाद। लेकिन समस्या अभी भी मौजूद है .. – Ravi

उत्तर

20

समस्या आपके कोड में नहीं है, लेकिन आपका उदाहरण इनपुट है। आप वास्तव में deserialize करने की कोशिश कर रहे हैं एक वस्तु है "बिल" नामक एक क्षेत्र के साथ, एक सूची नहीं! क्या आप इनपुट के रूप में उपयोग करना चाहिए है:

[{"billId":"billid3","amount":"13"}] 

यह ऑब्जेक्ट की श्रृंखला है, जो एक सूची में बदल जाती है है।

+0

आह .. सूचक के लिए धन्यवाद। मैं वसंत 3 + जैक्सन मैपर का उपयोग कर रहा हूं और जेसन आई/पी का उपयोग मैं नियंत्रक द्वारा किया गया था। – Ravi

+2

इसलिए मुझे {"बिल": [{"राशि": "13", "बिलआईडी": "बिलिड 3"}]} को [{"बिलआईडी": "बिलिड 3", "राशि": "13"} में कनवर्ट करने की आवश्यकता है ] मेरे ग्राहक पक्ष में। मैं जैक्सन रैपर विधि की तलाश में हूं जो मुझे बिना किसी कस्टम कोड के ऐसा करने देता है। – Ravi

+0

आह, मुझे स्प्रिंग + जैक्सन के साथ कोई अनुभव नहीं मिला है, इसलिए मैं और अधिक अंतर्दृष्टि प्रदान नहीं कर सकता। इसके लिए शुभकामनाएं! –

3

बजाय ObjectWriter का उपयोग कर ObjectMapper

Writer writer=new StringWriter(); 

     ObjectWriter oWriter=om.writerWithType(new TypeReference<List<Bill>>() { 
     }); 
     oWriter.writeValue(writer, result); 

मैं जैक्सन 1.9.2