2015-06-17 10 views
5

से अज्ञात फ़ील्ड की सूची प्राप्त करें मेरे पास एक JSON स्कीमा है, और एक जेसन स्ट्रिंग जो स्कीमा से मेल खाती है, सिवाय इसके कि इसमें कुछ अतिरिक्त फ़ील्ड हो सकते हैं। यदि मैं objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); नहीं जोड़ता तो जैक्सन अपवाद फेंक देगा यदि वे फ़ील्ड हैं। क्या उन्हें लॉग इन करने के लिए उन अतिरिक्त फ़ील्ड का संग्रह प्राप्त करने का कोई तरीका है, भले ही मैं अपवाद फेंकूं?जैक्सन

public boolean validate(Message<String> json) { 
    List<String> errorList = jsonSchema.validate(json.getPayload()); 
    ObjectMapper mapper = new ObjectMapper(); 
    try { 
     Update update = mapper.readValue(json.getPayload(), Update.class); 
    } catch (IOException e) { 
     System.out.println("Broken"); 
    } 
    if(!errorList.isEmpty()) { 
     LOG.warn("Json message did not match schema: {}", errorList); 
    } 
    return true; 
} 

उत्तर

6

मैं वहाँ बॉक्स से बाहर इस तरह के एक विकल्प है नहीं लगता है:

यहाँ कोड के प्रासंगिक सा है।

आप फिर भी एक नक्शा (HashMap, ट्री-मैप) this article और this one में एक उदाहरण प्रस्तुत किया रूप में @JsonAnyGetter और @JsonAnySetter के साथ इन unkwown क्षेत्रों रख सकता है।

अपने अद्यतन वर्ग को यह करें:

private Map<String, String> other = new HashMap<String, String>(); 

    @JsonAnyGetter 
    public Map<String, String> any() { 
    return other; 
    } 

@JsonAnySetter 
    public void set(String name, String value) { 
    other.put(name, value); 
    } 

और तुम एक अपवाद फेंक कर सकते हैं अपने आप को अगर अतिरिक्त क्षेत्रों सूची खाली नहीं है। कि जाँच के लिए विधि:

public boolean hasUnknowProperties() { 
    return !other.isEmpty(); 
    } 
+0

समस्या यह है कि अद्यतन वर्ग स्वतः उत्पन्न होता है, इसलिए जो कुछ भी मैं इसमें जोड़ता हूं उसे मिटा दिया जाएगा। कोई अन्य विचार? – Tavo

+2

@Tavo अद्यतन कक्षा को बढ़ाएं। –

2

आप बस को पता है कि पहले अज्ञात संपत्ति (नाम) है चाहते हैं, मैं अपवाद आप प्राप्त है कि संपत्ति नाम के संदर्भ में है लगता है। पहली अज्ञात संपत्ति पर प्रसंस्करण बंद होने के बाद से आप अधिक जानकारी प्राप्त नहीं कर पाएंगे (या, यदि अनदेखा हो रहा है, तो वह मान छोड़ा गया है)।

@JsonAnySetter का उपयोग किया गया था जो एक अच्छा विकल्प है।