जैक्सन (JSON) के साथ सीरियल करना - "कोई धारावाहिक नहीं मिला"?


262

मुझे एक अपवाद मिलता है जब जैक्सन का उपयोग करके एक बहुत ही सरल वस्तु को क्रमबद्ध करने की कोशिश की जाती है। त्रुटि:

org.codehaus.jackson.map.JsonMappingException: कोई MyPackage.TestA वर्ग के लिए मिला कोई भी धारावाहिक बनाने वाला नहीं है और बीनसेराइज़र बनाने के लिए खोजी गई कोई भी संपत्ति नहीं है (अपवाद से बचने के लिए, SerializationConfig.Ferr_ON_EMPTY_BEANS को अक्षम करें))

नीचे क्रमबद्ध करने के लिए सरल वर्ग और कोड है।

क्या कोई मुझे बता सकता है कि मुझे यह त्रुटि क्यों मिली?

public class TestA {
    String SomeString = "asd";
}

TestA testA = new TestA();
ObjectMapper om = new ObjectMapper();
try {
    String testAString = om.writeValueAsString(testA); // error here!

    TestA newTestA = om.readValue(testAString, TestA.class);
} catch (JsonGenerationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (JsonMappingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

मैंने जैक्सन के साथ एक कस्टम सीरियल लिखने वाले के बारे में एक पोस्ट लिखी जो कुछ के लिए उपयोगी हो सकती है।
सैम बेरी

जवाबों:


329

जैसा कि पहले ही वर्णन किया गया है, एक ObjectMapperउदाहरण का डिफ़ॉल्ट कॉन्फ़िगरेशन केवल उन गुणों तक पहुँच है जो सार्वजनिक फ़ील्ड हैं या जिनके पास सार्वजनिक गेटर्स / सेटर हैं। फ़ील्ड की परिभाषा बदलने के लिए या सार्वजनिक गेटटर / सेटर प्रदान करने के लिए वर्ग परिभाषा को बदलने का एक विकल्प VisibilityCheckerएक अलग संपत्ति दृश्यता नियम को निर्दिष्ट (अंतर्निहित ) करना है। जैक्सन 1.9 ObjectMapper.setVisibility()ऐसा करने के लिए सुविधा विधि प्रदान करता है। मूल प्रश्न में उदाहरण के लिए, मैं संभवतः इसे इस रूप में कॉन्फ़िगर करूंगा

myObjectMapper.setVisibility(JsonMethod.FIELD, Visibility.ANY);

जैक्सन के लिए> 2.0:

myObjectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);

संबंधित कॉन्फ़िगरेशन विकल्पों के बारे में अधिक जानकारी और विवरण के लिए, मैं JavaDocsObjectMapper.setVisibility() की समीक्षा करने की सलाह देता हूं ।


59
इसने मेरे लिए काम किया। जैक्सन 2.0 के रूप में, ObjectMapper # setVisibility पहले तर्क के रूप में एक PropertyAccessor लेता है। बराबर ऑनलाइनर है myObjectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
डैन रॉबिन्सन

@DanRobinson मैंने वही इस्तेमाल किया। लेकिन वास्तव में मैं yaml फ़ाइल उत्पन्न कर रहा हूं। इसलिए JSONString के लिए: {"term":{"call_failed":"true"}}यह yaml संरचना उत्पन्न कर रहा है जैसे: filter: map: term: map: call_failed: "true"यह mapकीवर्ड क्यों उत्पन्न कर रहा है ? मैं इसे कैसे हटा सकता हूं ?
मनीष कुमार

7
मैंने शायद इस त्रुटि के साथ 8 घंटे बिताए, यह महसूस न करने के लिए कि मेरी गेट्टर विधि उस पर "सार्वजनिक" नहीं थी..तो बेवकूफ
माइक केलॉग

1
मैं यह त्रुटि हो रही है जबकि
क्लाइंट रैपर को

1
आप @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)अपनी कक्षा के ऊपर एनोटेशन भी जोड़ सकते हैं
7

74

जैक्सन के लिए उस वर्ग को अनुक्रमित करने के लिए, SomeStringफ़ील्ड को या तो होना चाहिए public(अभी यह पैकेज स्तर अलगाव है) या आपको इसके लिए गेट्टर और सेटर विधियों को परिभाषित करने की आवश्यकता है।


5
कृपया इस सवाल का जवाब ध्यान दें गलत है - क्षेत्र नहीं है की जरूरत है सार्वजनिक है या एक गेटर और सेटर है। इस प्रश्न के एक अन्य उत्तर में, मैंने एक वैकल्पिक विन्यास प्रदान किया जिसमें क्रमबद्ध होने के लिए मूल डेटा संरचना में परिवर्तन की आवश्यकता नहीं है।
प्रोग्रामर ब्रूस

9
जवाब उपयोगी है, भले ही 100% ठीक नहीं है। मैं अपनी वार्स पर 'जनता' रखना भूल गया, और इस ओर इशारा किया। धन्यवाद!
क्रिसपॉनिक्स

53

मुझे अपने सोर्स कोड में भी यही समस्या है। मैंने अभी जोड़ा

प्राप्त करनेवाला

तथा

बैठानेवाला

समस्या हल हो गई।


1
कई अलग-अलग चीजों की कोशिश की, और समाधान उतना ही सरल है .... और यह इसे स्पष्ट रूप से कहता है: "बनाने के लिए कोई गुण नहीं खोजा गया"।
अक् स

2
@PhilipRego का मतलब है कि उन्होंने मैदान के लिए एक गेट्टर और सेटर जोड़ा।
पॉल

मैं लुम्बोक लाइब्रेरी का उपयोग करता हूं, इसलिए मैं सिर्फ एनोटेशन गेट्टर और सेटर जोड़ता हूं। और सब कुछ ठीक था। धन्यवाद।
रहमत हिदायत

हाँ,
गेटर्स

25

मेरे मामले में समस्या यह थी कि जैक्सन बिना किसी विशेषता के और न ही तरीकों से किसी खाली वस्तु को क्रमबद्ध करने की कोशिश कर रहा था।

जैसा कि अपवाद में सुझाव दिया गया था कि मैंने खाली फलियों पर विफलता से बचने के लिए निम्नलिखित पंक्ति जोड़ी:

जैक्सन 1.9 के लिए

myObjectMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);

जैक्सन के लिए 2.X

myObjectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

आप जैक्सन को अक्षम कर पाने में एक सरल उदाहरण पा सकते हैं fail_on_empty_beans


9

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

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)

7

यदि आप उस ऑब्जेक्ट से युक्त क्लास को एडिट कर सकते हैं, तो मैं आमतौर पर एनोटेशन जोड़ देता हूं

import com.fasterxml.jackson.annotation.JsonIgnore;

@JsonIgnore 
NonSerializeableClass obj;

2
यह त्रुटि तब भी होती है जब आपकी कक्षा में नाम के साथ शुरू होने वाला एक तरीका होता है ... उदाहरण के लिए NonSerializableClass getMyNonSerializableObject ()। जैक्सन इसे क्रमबद्ध करने की कोशिश करता है और विफल रहता है। इस समस्या को हल करने के लिए बस @JsonIgnore जोड़ें या विधि का नाम बदलें।
एलेक्सी पोडलासोव

1
पुराने संस्करण का उपयोग किया:org.codehaus.jackson.annotate.JsonIgnore
AlikElzin-kilaka

6

यदि आप अपनी वापसी स्थिति पर .build () विधि जोड़ना भूल जाते हैं, तो यह त्रुटि भी है।

return Response.status(Status.OK);         // fails
return Response.status(Status.OK).build(); // works

मुझे बिल्ड () विधि के बिना निम्नलिखित त्रुटि मिली:

org.codehaus.jackson.map.JsonMappingException: No serializer found for class com.sun.jersey.core.spi.factory.ResponseBuilderImpl

4

SpringBoot2.0 oot मैं इसे कोड का पालन करके हल करता हूं:

@Bean public ObjectMapper objectMapper() {
 return new ObjectMapper().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);}

1
आपको अपने मॉडल में गेटटर और सेटर विधियां रखनी चाहिए।
Janus

1
एसओ में आपका स्वागत है! योगदान के लिए धन्यवाद। कृपया अपने उत्तर में एक स्पष्टीकरण जोड़ें, इसलिए यह स्पष्ट है कि कोड क्या करता है, यह क्यों काम करता है और यह कैसे ओपीएस प्रश्न का उत्तर देता है।
मैक्स वोल्मर

इससे मुझे मदद मिली! लेकिन मेरी राय में, आपको संदर्भ के ObjectMapper को इंजेक्ट करना चाहिए और एक नया बनाने के बजाय इसे बाद में कॉन्फ़िगर करना चाहिए।
RoBeaToZ

3

Oracle जावा अनुप्रयोगों के लिए, ObjectMapperतात्कालिकता के बाद इसे जोड़ें :

mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);

2

मुझे हाइबरनेट प्रॉक्सी ऑब्जेक्ट के माध्यम से आलसी लोडिंग के साथ एक समान समस्या थी। इसके साथ उस वर्ग को एनोटेट करके समझें जिसमें आलसी भरी हुई निजी संपत्तियाँ हों:

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})

इससे मेरी समस्या हल हो गई। क्या आप मुझे बता सकते हैं कि यह वास्तव में क्या करता है?
स्कारफेस

2

समस्या इसलिए हो सकती है क्योंकि आपने परिवर्तनशील घोषित कर दिया है private। यदि आप इसे बदलते हैं public, तो यह काम करता है।

बेहतर विकल्प इसके लिए गेट्टर और सेटर विधियों का उपयोग करना है।

इस मुद्दे को हल करेगा!


2

मुझे ऐसा करने के कम से कम तीन तरीके मिले:

  1. public gettersअपनी इकाई में जोड़ें जिसे आप क्रमबद्ध करने की कोशिश करते हैं;
  2. यदि आप नहीं चाहते हैं, तो इकाई के शीर्ष पर एक एनोटेशन जोड़ें public getters। इस से जैक्सन के लिए डिफ़ॉल्ट बदल जाएगा Visbility=DEFAULTकरने के लिए @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)जहां किसी भी उपयोग संशोधक स्वीकार किए जाते हैं;
  3. ObjectMapperसेटिंग करके अपने विश्व स्तर पर बदलाव करें objectMapperInstance.setVisibility(JsonMethod.FIELD, Visibility.ANY);। यदि आपको विश्व स्तर पर इस कार्यक्षमता की आवश्यकता नहीं है तो इसे टाला जाना चाहिए।

अपनी आवश्यकताओं के आधार पर चुनें।


2

यहां तीन विकल्प दिए गए हैं:

  1. डेटा / वर्ग जो एक्सेस किया गया है वह होना चाहिए public
  2. यदि नहीं public, तो गेटर्स और सेटर जोड़ें
  3. या जोड़ें @JsonIgnore("context")

1

कृपया इसे बीन के लिए कक्षा स्तर पर उपयोग करें:

@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})

1

सेटर और गेटटर जोड़ने से भी समस्या हल हो जाएगी क्योंकि यह मेरे लिए तय है। पूर्व के लिए:

public class TestA {
    String SomeString = "asd";

    public String getSomeString () {        return SomeString ;     }

    public void setSomeString (String SS ) {        SomeString = SS ;   } 
}


0

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


0

वसंत बूट में 2.2.5

गटर और सेटर को जोड़ने के बाद

मैंने फ़ील्ड के शीर्ष पर @JsonIgnore जोड़ा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.