2016-02-04 7 views
5

मैं एक ऐसी सेवा का उपभोग करने की कोशिश कर रहा हूं जो मुझे एक क्षेत्र के साथ एक इकाई प्रदान करे जो कि यह एक सरणी है।जैक्सन सूची में एक आइटम को deserialize

{ 
    "id": "23233", 
    "items": [ 
    { 
     "name": "item 1" 
    }, 
    { 
     "name": "item 2" 
    } 
    ] 
} 

लेकिन जब सरणी में एक ही आइटम होता है, तो आइटम को एक तत्व की सरणी के बजाय वापस कर दिया जाता है।

{ 
    "id": "43567", 
    "items": { 
     "name": "item only" 
    } 
} 

इस मामले में, जैक्सन मेरी जावा ऑब्जेक्ट में कनवर्ट करने में विफल रहता है।

public class ResponseItem { 

    private String id; 
    private List<Item> items; 

    //Getters and setters... 
} 

क्या इसके लिए कोई सीधा समाधान है?

+0

ऐसा लगता है कि उस सेवा के लिए कुछ अजीब व्यवहार है। प्रदाता को यह ठीक करने के लिए बताने का कोई मौका? – Thomas

+0

@ थॉमस दुर्भाग्य से नहीं। यह सैकड़ों उपयोगकर्ताओं के साथ एक बड़ा सास प्रदाता है और मैं उनमें से एक हूं। – WinterN

उत्तर

8

आप इस समस्या के लिए पूछने वाले पहले व्यक्ति नहीं हैं। यह बहुत पुराना लगता है। प्रलेखन पर

देखो: http://fasterxml.github.io/jackson-databind/javadoc/2.5/com/fasterxml/jackson/databind/DeserializationFeature.html#ACCEPT_SINGLE_VALUE_AS_ARRAY

आप अपने वस्तु नक्शाकार को यह जैक्सन सुविधा जोड़ने की जरूरत है

इस समस्या को देखने के बाद, आप DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY उपयोग कर सकते हैं।

मुझे उम्मीद है कि यह आपकी मदद करेगा।

-2

मैं सुंदर जीसन हिचकी के बिना ऐसा करने में सक्षम हूं। उम्मीद है कि अगर आप इसके साथ फंस गए हैं तो कोई आपको जैक्सन के साथ मदद कर सकता है।

(उदाहरण: https://stackoverflow.com/a/18547661/1638595)

संपादित करें: "नहीं कर सकते हैं" के बदले "उम्मीद है कि कोई आपको ... मदद कर सकते हैं": हे, खेद का कहना है कि करने के लिए होती। अशिष्ट दिखाई दिया।

1

इसे हल करने के लिए एक कस्टम जेसनडेसरियललाइज़र का उपयोग किया जा सकता है।

उदा। उसके बाद यह काम करेंगे

@JsonDeserialize(using = CustomDeserializer.class) 
private List<Item> items; 

:

class CustomDeserializer extends JsonDeserializer<List<Item>> { 

    @Override 
    public List<Item> deserialize(JsonParser jsonParser, DeserializationContext context) 
      throws IOException, JsonProcessingException { 

     JsonNode node = jsonParser.readValueAsTree(); 

     List<Item> items = new ArrayList<>(); 
     ObjectMapper mapper = new ObjectMapper(); 

     if (node.size() == 1) { 
      Item item = mapper.readValue(node.toString(), Item.class); 
      items.add(item); 

     } else { 
      for (int i = 0; i < node.size(); i++) { 
       Item item = mapper.readValue(node.get(i).toString(), Item.class); 
       items.add(item); 
      } 
     } 

     return items; 
    } 

} 

आप की तरह, यह उपयोग करने के लिए डी-क्रमानुसार करने items जैक्सन बताने के लिए की जरूरत है। हैप्पी कोडिंग :)

+0

यह बुरा है। गहरे ढांचे के साथ काम नहीं करेगा जहां आप कई स्तरों पर सरणी के रूप में सिंगल वैल्यू चाहते हैं। डिफ़ॉल्ट सूची में पूरी सूची शाखा को deserialize करने के लिए एक अलग मैपर का उपयोग करना। अतिरिक्त सूची में प्रत्येक सूची deserialization के साथ तत्काल हो जाता है। –

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