दिलचस्प पोस्ट
डायनामिक प्रॉपर्टी नामों वाला एक ऑब्जेक्ट बनाएं एकाधिक डेटाबेस कनेक्शन और Yii 2.0 एक कॉलम (लम्बी प्रारूप) में माप स्तंभ (चौड़े प्रारूप) के एकाधिक सेटों को फिर से करना जावा में HTTP पोस्ट अनुरोध भेजा जा रहा है कक्षा असंतुलन से निपटना: नुकसान में स्केलिंग योगदान और एसजीडी बयान बनाम IDisposable.Dispose का उपयोग करना () सभी एजेक्स कॉल पूर्ण होने पर कैसे पता करें विंडो के बाहर छुआ गतिविधि की तरह डायलॉग थीम को कैसे रद्द करें? लगातार जावा एफएफ़ कार्यकर्ता थ्रेड में UI अपडेट करें पाठ से भाषण (टीटीएस) – Android पायथन और जावास्क्रिप्ट को एकीकृत करने का सर्वोत्तम तरीका? मोबाइल उपयोगकर्ता फेसबुक पेज टैब तक पहुंचने में असमर्थ हैं HTTP हेडर कैसे सेट करें (कैश-कंट्रोल के लिए)? किसी HTTP GET अनुरोध पर डेटा को क्यों संशोधित नहीं किया जाना चाहिए? "__block" कीवर्ड का क्या मतलब है?

जैक्सन जे एससन के साथ: अपरिचित क्षेत्र, जिसे अनावश्यक रूप से चिह्नित नहीं किया गया

मुझे एक निश्चित जेएसओएन स्ट्रिंग को जावा ऑब्जेक्ट में कनवर्ट करना होगा। मैं जैक्सन का उपयोग जेसनसन के लिए कर रहा हूँ। इनपुट 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) 

वेब के समाधान से एकत्रित समाधान "जैक्सन जे एससन के साथ: अपरिचित क्षेत्र, जिसे अनावश्यक रूप से चिह्नित नहीं किया गया"

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

 @JsonIgnoreProperties 

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

 @JsonIgnoreProperties(ignoreUnknown = true) 

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

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

यह उन सभी गुणों को नजरअंदाज कर देगा जो घोषित नहीं हैं।

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

इसलिए प्राप्तकर्ता का नाम "getWrapper ()" होना चाहिए, या इसके साथ टिप्पणी:

 @JsonProperty("wrapper") 

यदि आप ग्रहण विधि नाम को पसंद करते हैं तो

यह बिल्कुल मेरे लिए काम किया

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

@JsonIgnoreProperties(ignoreUnknown = true) टिप्पणी नहीं किया।

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

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

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

 @JsonIgnoreProperties(ignoreUnknown = true) 

यह सभी की तुलना में बेहतर काम करता है इस संपत्ति का संदर्भ लें

 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); 

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

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

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

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

     @JsonIgnoreProperties(ignoreUnknown = true) 
  2. ObjectMapper को कॉन्फ़िगर करें जो निम्नानुसार POJO / json serializes / De-serializes:

     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) 

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

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

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

  // to prevent specified fields from being serialized or deserialized // (ie 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) 

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

मुझे लगता है कि तय करने के लिए अपने रैपर वर्ग के क्षेत्र का नाम "विद्यार्थियों" के बजाय "आवरण" करने के लिए है

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

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

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

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

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

जैसा कि कोई अन्य उल्लेख नहीं किया है, मैंने सोचा था कि …

समस्या है कि आपकी संपत्ति में आपके JSON को "wrapper" कहा जाता है और आपकी संपत्ति को "छात्र" कहा जाता है।

तो या तो …

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

जेसन प्रॉपर्टी और जावा प्रॉपर्टी के नामों में बेमेल नहीं होने के कारण फ़ील्ड छात्रों को नीचे बताएं

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

आपका सुझाव

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

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

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

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

 class Wrapper { List<Student> wrapper; } 

क्या मेरे लिए काम किया, संपत्ति सार्वजनिक बनाने के लिए किया गया था यह मेरे लिए समस्या का हल किया

मेरे भाग के लिए, एकमात्र रेखा

@JsonIgnoreProperties(ignoreUnknown = true)

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

बस जोड़ दो

 @JsonInclude(Include.NON_EMPTY) 

जैक्सन 2.4.0

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

 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 

मैंने इस समस्या को अपने एसोसिएटर के हस्ताक्षर और मेरे पॉजो क्लास के गेटर तरीके बदलकर ही तय किया है। मुझे जो करना था, मैपर की तलाश में मिलते हुए मिलान करने के लिए getObject विधि को बदलना था। मेरे मामले में मुझे मूल रूप से एक GetImageUrl था, लेकिन JSON डेटा में image_url जो मैपर को फेंक रहा था। मैंने अपने सेटर और गेटर्स को इमेज_आरएल और सेट इमेज_यूआरएल दोनों में बदल दिया।

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

या तो बदलें

 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"}]} 

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); 

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

[ https://firebase.google.com/support/guides/firebase-android%5D :

अपने जावा मॉडल वस्तुओं को अपडेट करें

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

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

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

 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 एसडीके में व्यवहार करने के लिए चाहते हैं और अपवाद छोड़ देते हैं, तो अज्ञात गुण हैं, तो आप अपने वर्ग पर एक @ThrowOnExtraProperties एनोटेशन डाल सकते हैं।

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

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

आपको बस "फ़ील्ड" से सूची के क्षेत्र को सिर्फ "जेसन फाइल" में बदलना चाहिए और मैपर इसे देखेंगे।

मेरे मामले में यह आसान था: REST-service JSON ऑब्जेक्ट अद्यतन किया गया था (एक संपत्ति जोड़ा गया था), लेकिन बाकी-क्लाइंट JSON ऑब्जेक्ट नहीं था। जैसे ही मैंने JSON क्लाइंट को अपडेट किया है, वही 'अपरिचित फ़ील्ड …' अपवाद गायब हो गया है।

आपकी जेसन स्ट्रिंग मैप किए गए वर्ग के साथ इनलाइन नहीं है। इनपुट स्ट्रिंग बदलें

 String jsonStr = "{\"students\"\:[{\"id\":\"13\",\"name\":\"Fred\"}]}"; 

या अपने मैप किए गए वर्ग को बदल दें

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

आपको उस कक्षा के सभी फ़ील्ड को सत्यापित करने की आवश्यकता है जिसमें आप पार्सिंग कर रहे हैं, इसे अपने मूल JSONObject के समान JSONObject । यह मेरी मदद की और मेरे मामले में

@JsonIgnoreProperties(ignoreUnknown = true) बिल्कुल मदद नहीं किया।

मुझे सार्वजनिक क्षेत्र बनाया गया था, मेरे लिए काम किया आपके मामले में नीचे की तरह:

 public Class Student { public String name; public String id; 

}