2014-07-02 10 views
5

मैं किसी दिए गए संपत्ति के आधार पर पार्सिंग सबक्लास को मैप करने के लिए @JsonTypeInfo और @JsonSubTypes का उपयोग कर रहा हूं। यहां मेरे नमूना JSON का एक संक्षिप्त उदाहरण है जिसे मैं पार्स करना चाहता हूं।जैक्सन पॉलिमॉर्फिक प्रकार मैपिंग को अनदेखा करें

{ "animals": [ 
     { "type" : "dog", "name" : "spike" } 
    ,{ "type" : "cat", "name" : "fluffy" } 
]} 

वर्ग

के रूप में इस का उपयोग करते हुए हालांकि, समस्या तब होती है JSON प्रकार है कि मैं अनदेखा करना चाहते हैं जब। उदाहरण के लिए, अगर मैं एक नए प्रकार "सुअर" है कि मैं नहीं है वास्तव में एक वस्तु के रूप deserialize करना चाहते हैं:

Could not resolve type id 'pig' into a subtype of [simple type, class Animal]

:

{ "animals": [ 
     { "type" : "dog", "name" : "spike" } 
    ,{ "type" : "cat", "name" : "fluffy" } 
    ,{ "type" : "pig", "name" : "babe" } 
]} 

और यह पार्स करने के लिए प्रयास करते हैं, यह मुझे इस त्रुटि दे देंगे

मैं इसे कैसे ठीक कर सकता हूं ताकि मैं केवल 'कुत्ते' और 'बिल्ली' के उन जानवरों को मानचित्र कर सकूं, और बाकी सब कुछ अनदेखा कर सकूं?

+0

क्या आपने अपनी समस्या हल की है? –

उत्तर

6

आप java.lang.Void या NoClass आप उपयोग कर रहे जैक्सन संस्करण के आधार पर करने के लिए JsonTypeInfo.defaultImpl एनोटेशन attibute की स्थापना करके अपवाद बच सकते हैं।

यहाँ एक उदाहरण है:

public class JacksonUnknownType { 
    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, 
      include = JsonTypeInfo.As.PROPERTY, 
      property = "type", defaultImpl = Void.class) 
    @JsonSubTypes({ 
      @JsonSubTypes.Type(value = Cat.class, name = "cat"), 
      @JsonSubTypes.Type(value = Dog.class, name = "dog")}) 
    public abstract static class Animal { 
     public String name; 
     @Override 
     public String toString() { 
      return getClass().getName() + " :: " + name; 
     } 
    } 

    public static class Dog extends Animal { 
    } 

    public static class Cat extends Animal { 
    } 

    public static final String JSON = "[\n" + 
      "  { \"type\" : \"dog\", \"name\" : \"spike\" }\n" + 
      "  ,{ \"type\" : \"cat\", \"name\" : \"fluffy\" }\n" + 
      "  ,{ \"type\" : \"pig\", \"name\" : \"babe\" }\n" + 
      "]"; 

    public static void main(String[] args) throws IOException { 
     ObjectMapper mapper = new ObjectMapper(); 
     List<Animal> value = mapper.readValue(JSON, new TypeReference<List<Animal>>() {}); 
     System.out.println(value); 
    } 

} 

आउटपुट:

[stackoverflow.JacksonUnknownType$Dog :: spike, stackoverflow.JacksonUnknownType$Cat :: fluffy, null, null, null] 

ध्यान दें कि जिसके परिणामस्वरूप संग्रह जैक्सन में एक बग हो सकता है 1. इस के बजाय 3 अशक्त आइटम शामिल हैं, लेकिन यह करने के लिए आसान है सहन।

+0

मैं वास्तव में एक कस्टम deserializer मार्ग के साथ चला गया, लेकिन अगर आप कुछ प्रकारों को अनदेखा करना चाहते हैं तो यह भी काम करता है। – geofrey

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