जैक्सन विद जेन्सन: अपरिचित क्षेत्र, जो अज्ञानी के रूप में चिह्नित नहीं है


675

मुझे एक निश्चित JSON स्ट्रिंग को जावा ऑब्जेक्ट में बदलने की आवश्यकता है। मैं JSON हैंडलिंग के लिए जैक्सन का उपयोग कर रहा हूं। मुझे JSON के इनपुट पर कोई नियंत्रण नहीं है (मैं वेब सेवा से पढ़ता हूं)। यह मेरा इनपुट JSON है:

{"wrapper":[{"id":"13","name":"Fred"}]}

यहाँ एक सरलीकृत उपयोग मामला है:

private void tryReading() {
    String jsonStr = "{\"wrapper\"\:[{\"id\":\"13\",\"name\":\"Fred\"}]}";
    ObjectMapper mapper = new ObjectMapper();  
    Wrapper wrapper = null;
    try {
        wrapper = mapper.readValue(jsonStr , Wrapper.class);
    } catch (Exception e) {
        e.printStackTrace();
    }
    System.out.println("wrapper = " + wrapper);
}

मेरी इकाई वर्ग है:

public Class Student { 
    private String name;
    private String id;
    //getters & setters for name & id here
}

मेरा रैपर क्लास मूल रूप से छात्रों की मेरी सूची प्राप्त करने के लिए एक कंटेनर वस्तु है:

public Class Wrapper {
    private List<Student> students;
    //getters & setters here
}

मुझे यह त्रुटि और "रैपर" रिटर्न मिलता रहता है null। मुझे यकीन नहीं है कि क्या गायब है। क्या कोई कृपया मदद कर सकता है?

org.codehaus.jackson.map.exc.UnrecognizedPropertyException: 
    Unrecognized field "wrapper" (Class Wrapper), not marked as ignorable
 at [Source: java.io.StringReader@1198891; line: 1, column: 13] 
    (through reference chain: Wrapper["wrapper"])
 at org.codehaus.jackson.map.exc.UnrecognizedPropertyException
    .from(UnrecognizedPropertyException.java:53)

2
मैंने एक रैपर क्लास बनाने से बचने के लिए यह उपयोगी पाया: Map dummy<String,Student> = myClientResponse.getEntity(new GenericType<Map<String, Student>>(){});और फिरStudent myStudent = dummy.get("wrapper");
पुलकितसिंघल

6
JSON ऐसा दिखता है: स्ट्रिंग jsonStr = "{\" छात्रों \ "\: [{\" आईडी \ ": \" 13 \ ", \" नाम \ ": \" फ्रेड \ "}}}; यदि आप अपने बाकी के अनुरोध में रैपर वस्तु की उम्मीद कर रहे हैं
दिमित्री अल्गाज़िन


5
और संयोग से, इस प्रश्न के अधिकांश उत्तर वास्तव में एक अलग प्रश्न का उत्तर देते हैं, अर्थात् ऊपर दिए गए लिंक के समान।
तिल

4
अधिकांश उत्तर वास्तव में हल करने के बजाय गलीचा के नीचे ब्रश की समस्या में मदद करते हैं :(
NoobEditor

जवाबों:


990

आप जैक्सन के वर्ग-स्तरीय एनोटेशन का उपयोग कर सकते हैं:

import com.fasterxml.jackson.annotation.JsonIgnoreProperties

@JsonIgnoreProperties
class { ... }

यह आपके द्वारा अपने POJO में परिभाषित नहीं की गई प्रत्येक संपत्ति को अनदेखा करेगा। बहुत उपयोगी है जब आप सिर्फ JSON में कुछ गुणों की तलाश में हैं और पूरी मैपिंग नहीं लिखना चाहते हैं। जैक्सन की वेबसाइट पर अधिक जानकारी । यदि आप किसी गैर घोषित संपत्ति की उपेक्षा करना चाहते हैं, तो आपको लिखना चाहिए:

@JsonIgnoreProperties(ignoreUnknown = true)

9
एरियल, क्या इस बाहरी वर्ग को घोषित करने का कोई तरीका है?
जॉन लोरसो

4
मैं उन वर्गों को क्रमबद्ध कर रहा हूं जो मेरे पास नहीं हैं (संशोधित नहीं कर सकते हैं)। एक दृश्य में, मैं एक निश्चित क्षेत्र के साथ क्रमबद्ध करना चाहूंगा। एक अन्य दृष्टिकोण में, मैं क्रमबद्ध क्षेत्रों का एक अलग सेट (या शायद JSON में गुणों का नाम बदलना चाहता हूं) चाहता हूं।
जॉन लोरसो

11
मुझे यह जोड़ना चाहिए कि (ignoreUnknown = true)जब आपको अपनी कक्षा को एनोटेट करने की आवश्यकता होगी, अन्यथा यह काम नहीं करेगा
नेक्रोमांसर

85
जूलियन, यह ओपी के सवाल का सही जवाब नहीं है। हालाँकि, मुझे संदेह है कि लोग यहां आते हैं क्योंकि वे Google को POJO में परिभाषित नहीं की गई संपत्तियों को अनदेखा करने का तरीका बताते हैं और यह पहला परिणाम है, इसलिए वे इसे और सुरेश की प्रतिक्रिया (मेरे साथ क्या हुआ) को वोट करते हैं। हालांकि मूल प्रश्न का अपरिभाषित गुणों की अनदेखी करने से कोई लेना-देना नहीं है।
रिक जाफे

5
यह एक बहुत ही बेवकूफ डिफ़ॉल्ट सेटिंग imho है, अगर आप अपने एपीआई में कोई प्रॉपर्टी जोड़ते, पूरे क्रमबद्धता में विफल रहता है
headsvk

478

आप उपयोग कर सकते हैं

ObjectMapper objectMapper = getObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

यह घोषित नहीं की गई सभी संपत्तियों की अनदेखी करेगा।


5
यह मेरे लिए काम नहीं किया, यह अभी भी अज्ञात गुणों पर विफल रहता है
डेनिस नियाज़ेव

1
क्या आप कृपया यू के कोड का एक टुकड़ा पेस्ट कर सकते हैं जो आप कर रहे हैं, आप शायद वहां कुछ चूक गए हैं। या तो ऐसा करने से या "@JsonIgnoreProperties (अनदेखा करना = सत्य)" का उपयोग करके आपकी समस्या का समाधान किया जाना चाहिए। वैसे भी शुभकामनाएँ।
सुरेश

27
FWIW - मुझे यह थोड़ा अलग enum आयात करना था: org.codehaus.jackson.map.eserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES
raf

9
^ ऊपर 2 से पहले जैक्सन संस्करणों के लिए है
755

10
आप इन कॉल को भी चेन कर सकते हैं जैसे: getObjectMapper ()। Disable (DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
icfantv

126

पहला उत्तर लगभग सही है, लेकिन क्या जरूरत है गेटटर विधि को बदलने की, नॉट फील्ड - फील्ड प्राइवेट है (और ऑटो-डिटेक्ट नहीं है); इसके अलावा, यदि दोनों दिखाई देते हैं, तो फ़ील्ड्स पर पूर्वता प्राप्त होती है। (निजी फ़ील्ड को दृश्यमान बनाने के तरीके भी हैं, लेकिन यदि आप प्राप्त करना चाहते हैं तो बहुत अधिक बिंदु नहीं है)

तो गेट्टर को या तो नाम दिया जाना चाहिए getWrapper(), या उसके साथ एनोटेट किया जाना चाहिए :

@JsonProperty("wrapper")

यदि आप के रूप में getter विधि नाम पसंद करते हैं।


कृपया विस्तृत करें - किस गॉटर को बदलने या एनोटेट करने की आवश्यकता है?
Frans

आपका मतलब @JsonGetter ("रैपर") के साथ एनोटेट है, है ना?
पेड्रम बशीरी

@pedrashashiri नहीं, मेरा मतलब है @JsonProperty। जबकि @JsonGetterएक कानूनी उर्फ ​​है, इसका उपयोग शायद ही कभी @JsonPropertyगेटर्स, सेटर और फील्ड के लिए किया जाता है ; सेटर और गेटर्स को हस्ताक्षर द्वारा अलग किया जा सकता है (कोई भी तर्क नहीं लेता है, गैर-शून्य देता है; अन्य एक तर्क लेता है)।
स्टेक्समैन

यह वह उत्तर है जिसकी मुझे तलाश थी! जैक्सन की तरह लगता है कि स्रोत JSON को आपके POJO में मैप करने में परेशानी होती है, लेकिन आप गेटर्स को टैग करके मैचों की गारंटी दे सकते हैं। धन्यवाद!
एंड्रयू किर्ना

90

जैक्सन 2.6.0 का उपयोग करते हुए, इसने मेरे लिए काम किया:

private static final ObjectMapper objectMapper = 
    new ObjectMapper()
        .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

और सेटिंग के साथ:

@JsonIgnoreProperties(ignoreUnknown = true)

12
उस विन्यास एनोटेशन के साथ अनावश्यक है
newworld

क्या आपको क्लास पर ऑब्जेक्टमेपर और एनोटेशन दोनों को कॉन्फ़िगर करने की आवश्यकता है? मुझे लगता है कि ऑब्जेक्टमैपर प्रत्येक वर्ग को एनोटेट करने की आवश्यकता के बिना सभी के लिए तय करेगा। मैं हालांकि एनोटेशन का उपयोग करता हूं।
प्रयागपाद

आपको एक ही कक्षा में दोनों सेटिंग्स की आवश्यकता नहीं है। वैश्विक स्तर पर संपत्ति ObjectMapperसेट करने के लिए , आप वैश्विक सिंग्लटन उदाहरण प्राप्त करने के लिए DI का उपयोग भी कर सकते FAIL_ON_UNKNOWN_PROPERTIESहैं।
user991710

आपको दोनों की आवश्यकता नहीं है, आप एक या दूसरे को चुन सकते हैं।
हेज़

58

इसे 2 तरीकों से प्राप्त किया जा सकता है:

  1. अज्ञात गुणों को अनदेखा करने के लिए POJO को चिह्नित करें

    @JsonIgnoreProperties(ignoreUnknown = true)
  2. कॉन्फ़िगर करें ObjectMapper जो नीचे दिए गए POJO / json को क्रमबद्ध / क्रमबद्ध करता है:

    ObjectMapper mapper =new ObjectMapper();            
    // for Jackson version 1.X        
    mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    // for Jackson version 2.X
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) 

2
यह स्वीकृत उत्तर क्यों होना चाहिए? यह सिर्फ अज्ञात गुणों को नजरअंदाज करने के लिए कहता है, जबकि सवाल यह था कि एक वस्तु में लिपटे जोंस को खोजने का एक तरीका था जिसे यह समाधान स्पष्ट रूप से नजरअंदाज करने के लिए कहता है।
सयंतन

42

यह पूरी तरह से मेरे लिए काम किया

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(
    DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

@JsonIgnoreProperties(ignoreUnknown = true) एनोटेशन नहीं किया।


2
नीचे दिया गया क्योंकि यह ओपी के सवाल का जवाब नहीं देता है। अज्ञात गुणों को अनदेखा करना उसकी समस्या को हल नहीं करता है, लेकिन उसे एक Wrapperऐसे उदाहरण के साथ छोड़ देता है जहां छात्रों की सूची nullखाली या खाली है।
फ्रैंस

37

यह सब इस संपत्ति को देखें।

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    projectVO = objectMapper.readValue(yourjsonstring, Test.class);

उम्मीद के मुताबिक काम करना!
MADHAIYAN M

हाँ, यह वही है जिसने मेरे मुद्दे को हल किया है - जो इस पोस्ट के शीर्षक से मेल खाता है।
स्कॉट लेंजबर्ग

उत्तर मेरे लिए अच्छी तरह से काम करते हैं और यह बहुत आसान है। धन्यवाद
अकीरा

29

यदि आप जैक्सन 2.0 का उपयोग कर रहे हैं

ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

इस विन्यास का मेरे लिए कोई प्रभाव क्यों नहीं है?
झोजी

@ झाझोजी यह जैक्सन संस्करण पर निर्भर करता है
Aalkhodiry

20

डॉक्टर के अनुसार आप चयनित फ़ील्ड या सभी फ़ील्ड को अनदेखा कर सकते हैं:

 // to prevent specified fields from being serialized or deserialized
 // (i.e. not include in JSON output; or being set even if they were included)
 @JsonIgnoreProperties({ "internalId", "secretKey" })

 // To ignore any unknown properties in JSON input without exception:
 @JsonIgnoreProperties(ignoreUnknown=true)

15

यह मेरे लिए निम्नलिखित कोड के साथ काम करता है:

ObjectMapper mapper =new ObjectMapper();    
mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

15

बसने वालों और गेटर्स को जोड़ने से समस्या हल हो गई , जो मैंने महसूस किया वह वास्तविक मुद्दा यह था कि इसे कैसे हल किया जाए लेकिन त्रुटि को दबाने / अनदेखा करने का तरीका नहीं। मुझे त्रुटि मिली " गैर-मान्यताप्राप्त क्षेत्र .. जो कि अज्ञानी के रूप में चिह्नित नहीं है .. "

हालाँकि मैं कक्षा के शीर्ष पर नीचे एनोटेशन का उपयोग करता हूं, लेकिन यह जन्स ऑब्जेक्ट को पार्स करने और मुझे इनपुट देने में सक्षम नहीं था

@JsonIgnoreProperties (अनदेखी = सत्य)

तब मुझे एहसास हुआ कि मैंने "रैपर" और "स्टूडेंट" के लिए सेटर और गेटर्स को जोड़ने के बाद सेटर और गेटर्स को नहीं जोड़ा, यह एक आकर्षण की तरह काम करता था।


यह एकमात्र ऐसा उत्तर प्रतीत होता है जो वास्तव में प्रश्न का उत्तर देता है। अन्य सभी उत्तर केवल अज्ञात गुणों को नजरअंदाज कर रहे हैं, लेकिन 'रैपर' एक अज्ञात संपत्ति नहीं है, यह वह है जिसे हम पार्स करने की कोशिश कर रहे हैं।
lbenedetto

14

जैक्सन शिकायत कर रहा है क्योंकि यह आपकी कक्षा के आवरण में एक फ़ील्ड नहीं ढूंढ सकता है जिसे "आवरण" कहा जाता है। यह ऐसा इसलिए कर रहा है क्योंकि आपके JSON ऑब्जेक्ट में "आवरण" नामक एक संपत्ति है।

मुझे लगता है कि फिक्स को "रैपर" के बजाय अपने रैपर क्लास के फील्ड का नाम बदलकर "रैपर" करना है।


धन्यवाद जिम। मैंने कोशिश की कि यह समस्या ठीक न हो। मुझे आश्चर्य हो रहा है कि क्या मुझे कुछ एनोटेशन याद आ रहा है ..
jshree

1
हम्म, क्या होता है जब आप जावा में बराबर डेटा बनाते हैं और फिर जैक्सन का उपयोग करके इसे JSON में लिखते हैं । उस JSON और ऊपर दिए गए JSON के बीच कोई भी अंतर होना चाहिए कि क्या गलत हो रहा है।
जिम फेर्र्स

इस जवाब ने मेरे लिए काम किया, उदाहरण के लिए सवाल से।
13-28

14

मैंने नीचे दी गई विधि की कोशिश की है और यह जैक्सन के साथ पढ़ने वाले ऐसे JSON प्रारूप के लिए काम करता है। पहले से सुझाए गए समाधान का उपयोग करें: के साथ गेटटर की व्याख्या करना@JsonProperty("wrapper")

आपका रैपर क्लास

public Class Wrapper{ 
  private List<Student> students;
  //getters & setters here 
} 

रैपर क्लास का मेरा सुझाव

public Class Wrapper{ 

  private StudentHelper students; 

  //getters & setters here 
  // Annotate getter
  @JsonProperty("wrapper")
  StudentHelper getStudents() {
    return students;
  }  
} 


public class StudentHelper {

  @JsonProperty("Student")
  public List<Student> students; 

  //CTOR, getters and setters
  //NOTE: If students is private annotate getter with the annotation @JsonProperty("Student")
}

हालांकि यह आपको प्रारूप का आउटपुट देगा:

{"wrapper":{"student":[{"id":13,"name":Fred}]}}

अधिक जानकारी के लिए https://github.com/FasterXML/jackson-annotations पर भी देखें

उम्मीद है की यह मदद करेगा


Stackoverflow में आपका स्वागत है। टिप, आप {}अपने कोड स्निपेट को प्रारूपित करने के लिए टूल बार में प्रतीकों का उपयोग कर सकते हैं ।
लेह

11

यह समाधान जेनरिक धाराओं को पढ़ते समय सामान्य होता है और केवल कुछ फ़ील्ड प्राप्त करने की आवश्यकता होती है, जबकि आपके डोमेन क्लासेस में फ़ील्ड को सही ढंग से मैप नहीं किया जा सकता है:

import org.codehaus.jackson.annotate.JsonIgnoreProperties;
@JsonIgnoreProperties(ignoreUnknown = true)

एक विस्तृत समाधान jsonschema2pojo जैसे उपकरण का उपयोग करने के लिए आवश्यक डोमेन कक्षाएं जैसे कि छात्र से प्रतिक्रिया के स्कीमा से छात्र को स्वचालित करने के लिए होगा। आप स्कीमा कन्वर्टर को किसी भी ऑनलाइन जसन द्वारा बाद कर सकते हैं।


10

नीचे के रूप में क्षेत्र के छात्रों की व्याख्या करें क्योंकि json संपत्ति और java संपत्ति के नामों में बेमेल है

public Class Wrapper {
    @JsonProperty("wrapper")
    private List<Student> students;
    //getters & setters here
}

9

जैसा कि किसी और ने उल्लेख नहीं किया है, मुझे लगा कि मैं ...

समस्या यह है कि आपके JSON में आपकी संपत्ति को "आवरण" कहा जाता है और Wrapper.class में आपकी संपत्ति को "छात्र" कहा जाता है।

तो या तो ...

  1. वर्ग या JSON में से किसी एक में संपत्ति का नाम ठीक करें।
  2. StaxMan की टिप्पणी के अनुसार अपने संपत्ति चर का उल्लेख करें।
  3. सेटर को सूचित करें (यदि आपके पास एक है)

6

सेट सार्वजनिक अपनी कक्षा क्षेत्रों नहीं निजी

public Class Student { 
    public String name;
    public String id;
    //getters & setters for name & id here
}

2
खराब अभ्यास - इससे एनकैप्सुलेशन टूट जाता है।
डाउनहिल्स्की

1
मैंने सुना है।
डाउनहिल्स्की

उपयोगकर्ता द्वारा इसका उपयोग करने पर आपकी कक्षा जोखिम में है क्योंकि इन क्षेत्रों के माध्यम से आंतरिक स्थिति को उत्परिवर्तित किया जा सकता है।
Downhillski

5

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


1
मेरे लिए काम किया: D
TienLuong

5

या तो बदलें

public Class Wrapper {
    private List<Student> students;
    //getters & setters here
}

सेवा

public Class Wrapper {
    private List<Student> wrapper;
    //getters & setters here
}

---- या ----

अपने JSON स्ट्रिंग को बदलें

{"students":[{"id":"13","name":"Fred"}]}

5

आपका सुझाव

{"wrapper":[{"id":"13","name":"Fred"}]}

इंगित करता है कि यह एक ऑब्जेक्ट है, जिसमें "रैपर" नाम का एक क्षेत्र है, जो छात्रों का एक संग्रह है। तो मेरी सिफारिश होगी,

Wrapper = mapper.readValue(jsonStr , Wrapper.class);

जहां Wrapperके रूप में परिभाषित किया गया है

class Wrapper {
    List<Student> wrapper;
}

5

नए फायरबेस एंड्रॉइड ने कुछ बड़े बदलाव पेश किए; डॉक्टर की प्रति के नीचे:

[ https://firebase.google.com/support/guides/firebase-android] :

अपने जावा मॉडल ऑब्जेक्ट को अपडेट करें

2.x एसडीके के रूप में, फायरबेस डेटाबेस जावा ऑब्जेक्ट को स्वचालित रूप से बदल देगा जिसे आप DatabaseReference.setValue()JSON में पास करते हैं और JSON का उपयोग करके जावा में पढ़ सकते हैं DataSnapshot.getValue()

नए SDK में, JSON को जावा ऑब्जेक्ट में पढ़ने के साथ DataSnapshot.getValue(), JSON में अज्ञात गुणों को अब डिफ़ॉल्ट रूप से नजरअंदाज कर दिया जाता है, इसलिए आपको कोई आवश्यकता नहीं है@JsonIgnoreExtraProperties(ignoreUnknown=true)

JSON पर जावा ऑब्जेक्ट लिखते समय फ़ील्ड / गेटर्स को बाहर करने के लिए, एनोटेशन को अब @Excludeइसके बजाय कहा जाता है @JsonIgnore

BEFORE

@JsonIgnoreExtraProperties(ignoreUnknown=true)
public class ChatMessage {
   public String name;
   public String message;
   @JsonIgnore
   public String ignoreThisField;
}

dataSnapshot.getValue(ChatMessage.class)

AFTER

public class ChatMessage {
   public String name;
   public String message;
   @Exclude
   public String ignoreThisField;
}

dataSnapshot.getValue(ChatMessage.class)

यदि आपके JSON में कोई अतिरिक्त प्रॉपर्टी है जो आपके जावा क्लास में नहीं है, तो आपको लॉग फ़ाइलों में यह चेतावनी दिखाई देगी:

W/ClassMapper: No setter/field for ignoreThisProperty found on class com.firebase.migrationguide.ChatMessage

आप @IgnoreExtraPropertiesअपनी कक्षा में एक एनोटेशन डालकर इस चेतावनी से छुटकारा पा सकते हैं । यदि आप चाहते हैं कि फायरबेस डेटाबेस व्यवहार करे जैसा कि उसने 2.x SDK में किया था और यदि कोई अज्ञात गुण हैं तो एक अपवाद फेंकें, आप @ThrowOnExtraPropertiesअपनी कक्षा में एक एनोटेशन डाल सकते हैं ।


4

मेरे हिस्से के लिए, एकमात्र लाइन

@JsonIgnoreProperties(ignoreUnknown = true)

काम भी नहीं किया।

बस जोड़ दो

@JsonInclude(Include.NON_EMPTY)

जैक्सन 2.4.0


4

इसने मेरे लिए पूरी तरह से काम किया

objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

4

मैंने बस अपने POJO वर्ग के अपने सेटर और गेट्टर विधियों के हस्ताक्षर बदलकर इस समस्या को ठीक किया। मुझे बस इतना करना था कि मैपर की तलाश करने के लिए गेटऑबजेक्ट विधि को बदल दें । मेरे मामले में मेरे पास मूल रूप से एक getImageUrl था , लेकिन JSON डेटा में image_url था जो मैपिंग बंद कर रहा था। मैंने अपने सेटर और गेटर्स दोनों को getImage_url और setImage_url में बदल दिया ।

उम्मीद है की यह मदद करेगा।


आप स्पष्ट रूप से सही हैं: यदि आप चाहते हैं कि नाम xxx_yyy है तो इसे कॉल करने का तरीका getXxx_yyy और setXxx_yyy होगा। यह बहुत अजीब है लेकिन यह काम करता है।
sivi

3

POJO को इस रूप में परिभाषित किया जाना चाहिए

प्रतिक्रिया वर्ग

public class Response {
    private List<Wrapper> wrappers;
    // getter and setter
}

आवरण वर्ग

public class Wrapper {
    private String id;
    private String name;
    // getters and setters
}

और मूल्य पढ़ने के लिए मैपर

Response response = mapper.readValue(jsonStr , Response.class);

लगभग। नहीं wrappers, लेकिन wrapper
Frans

@Frans Haha, त्रुटि पकड़ने के लिए धन्यवाद। मैं स्वाभाविक रूप से एक संग्रह के लिए बहुवचन का उपयोग करता हूं। लेकिन ओपी के सवाल के अनुसार, यह एकवचन होना चाहिए।
डिनो ट्व

3

यह बहुत देर से प्रतिक्रिया हो सकती है, लेकिन केवल POJO को इसे बदलने से समस्या में प्रदान किए गए जस स्ट्रिंग को हल करना चाहिए (चूंकि, इनपुट स्ट्रिंग आपके नियंत्रण में नहीं है जैसा आपने कहा):

public class Wrapper {
    private List<Student> wrapper;
    //getters & setters here
}

3

एक अन्य संभावना यह है कि यह संपत्ति application.properties में है spring.jackson.deserialization.fail-on-unknown-properties=false, जिसे आपके आवेदन में किसी अन्य कोड परिवर्तन की आवश्यकता नहीं होगी। और जब आप मानते हैं कि अनुबंध स्थिर है, तो आप इस संपत्ति को हटा सकते हैं या इसे सही चिह्नित कर सकते हैं।


3

यह वही समस्या नहीं हो सकती है जो ओपी के पास थी, लेकिन अगर कोई मेरे साथ भी यही गलती कर रहा था, तो इससे उन्हें अपनी समस्या हल करने में मदद मिलेगी। मुझे ओपी के रूप में एक ही त्रुटि मिली जब मैंने JsonProperty एनोटेशन के रूप में एक अलग निर्भरता से एक ObjectMapper का उपयोग किया।

यह काम:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.annotation.JsonProperty;

काम नहीं करता:

import org.codehaus.jackson.map.ObjectMapper; //org.codehaus.jackson:jackson-mapper-asl:1.8.8
import com.fasterxml.jackson.annotation.JsonProperty; //com.fasterxml.jackson.core:jackson-databind:2.2.3

धन्यवाद! आयात com.fasterxml.jackson.annotation.JsonProperty बजाय मेरे लिए काम किया अन्य :-)
फिल

2

Google ने मुझे यहां लाया और मुझे जवाब देखकर आश्चर्य हुआ ... सभी ने त्रुटि को दरकिनार करने का सुझाव दिया ( जो हमेशा विकास में बाद में 4 सिलवटों को काटता है ) इसे हल करने के बजाय तब तक जब तक कि यह सज्जन एसओ पर विश्वास करके बहाल नहीं हो जाते!

objectMapper.readValue(responseBody, TargetClass.class)

एक जेंस स्ट्रिंग को एक क्लास ऑब्जेक्ट में बदलने के लिए उपयोग किया जाता है, जो गायब है वह यह है कि TargetClassसार्वजनिक getटेर / setटर्स होना चाहिए । ओपी के प्रश्न के स्निपेट में भी वही गायब है! :)

नीचे के रूप में अपनी कक्षा lombok के माध्यम से काम करना चाहिए !!

@Data
@Builder
public class TargetClass {
    private String a;
}

2

आयात com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties


शायद कुछ और स्पष्टीकरण या डॉक्टर अच्छा होगा
बेंज

@JsonIgnoreProperties (अनदेखा = सत्य) ठीक काम करता है, धन्यवाद
Guilherme
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.