জ্যাকসনের (জেএসএন) সাথে সিরিয়ালিং করা - "কোনও সিরিয়ালাইজার পাওয়া যায় না"?


262

জ্যাকসন ব্যবহার করে খুব সাধারণ কোনও বস্তু সিরিয়াল করার চেষ্টা করার সময় আমি ব্যতিক্রম পাই। ভূল:

org.codehaus.jackson.map.JsonMappingException: মাইপ্যাকেজ.টেষ্টা ক্লাসের জন্য কোনও সিরিয়ালাইজার পাওয়া যায় নি এবং বিনসরিয়ালাইজার তৈরি করার জন্য কোনও বৈশিষ্ট্য খুঁজে পাওয়া যায় নি (ব্যতিক্রম এড়ানোর জন্য সিরিয়ালাইজেশন কনফিগকে অক্ষম করুন FAএফআইএফসিটার_ইএমপিটিওয়াই_বিইএনএস))

নীচে সিরিয়ালাইজ করার জন্য সহজ ক্লাস এবং কোড দেওয়া আছে।

কেউ আমাকে বলতে পারে কেন আমি এই ত্রুটিটি পাই?

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

জ্যাকসন> ২.০ এর জন্য:

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

সম্পর্কিত কনফিগারেশন বিকল্পগুলিতে আরও তথ্য এবং বিশদগুলির জন্য, আমি জাভাডক্স চালুObjectMapper.setVisibility() করার পরামর্শ দিচ্ছি


59
এটি আমার পক্ষে কাজ করেছে। জ্যাকসন ২.০ অনুসারে, অবজেক্টম্যাপার # সেটভিজিবিলিটি প্রথম যুক্তি হিসাবে একটি সম্পত্তি অ্যাক্সেসরকে গ্রহণ করে। সমতুল্য oneliner হয় myObjectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
ড্যান রবিনসন

@ ড্যানরবিনসন তবে আসলে আমি ইয়ামল ফাইল তৈরি করছি। সুতরাং JSON স্ট্রিংয়ের জন্য যেমন: {"term":{"call_failed":"true"}}এটি ইয়ামল কাঠামোটি উত্পন্ন করছে: filter: map: term: map: call_failed: "true"কেন এটি mapকীওয়ার্ড তৈরি করছে? আমি কীভাবে এটি অপসারণ করতে পারি?
মণীশ কুমার

7
আমি সম্ভবত এই ত্রুটিটি সহ 8 ঘন্টা অতিবাহিত করেছি, বুঝতে পারছি না যে আমার উত্সাহী পদ্ধতিতে এটি "প্রকাশ্য" নেই..এমন বোকা
মাইক কেলোগ

1
ক্লায়েন্টরেস্পোনসকে স্ট্রিংতে অবজেক্ট ম্যাপার ব্যবহার করে রূপান্তর করার সময় আমি এই ত্রুটিটি পাচ্ছি
ভিডিএক্স

1
আপনি @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)নিজের ক্লাসের উপরে
টিকাটিও

74

জ্যাকসনের সেই শ্রেণিটি সিরিয়াল করার জন্য SomeStringক্ষেত্রটি হয় public(এখনই এটি প্যাকেজ স্তর বিচ্ছিন্নকরণ) হওয়া উচিত বা এর জন্য আপনাকে গেটর এবং সেটার পদ্ধতিগুলি নির্ধারণ করতে হবে।


5
দয়া করে এই উত্তর নোট ভুল - ক্ষেত্র নেই প্রয়োজন সর্বজনীন করা বা গেটার এবং সেটার আছে। এই প্রশ্নের অন্য উত্তরে, আমি একটি বিকল্প কনফিগারেশন সরবরাহ করেছি যাতে সিরিয়ালায়িত হওয়ার জন্য মূল ডেটা কাঠামোর পরিবর্তনের প্রয়োজন হয় না।
প্রোগ্রামার ব্রুস

9
সঠিকভাবে 100% সঠিক না হলেও উত্তরটি কার্যকর। আমি আমার যুদ্ধগুলিতে 'পাবলিক' রাখতে ভুলে গেছি, এবং এটি তা উল্লেখ করেছে। ধন্যবাদ!
ক্রিসফিনিক্স

53

আমার সোর্স কোডেও আমার একই সমস্যা। আমি সবে যুক্ত করেছি

সংগ্রহকারী

এবং

গোয়েন্দা

সমস্যা সমাধান।


1
অনেকগুলি বিভিন্ন জিনিস চেষ্টা করে দেখুন, এবং সমাধানটি এর মতোই সহজ .... এবং এটি একেবারে স্পষ্টভাবে বলেছে: "কোনও সম্পত্তি তৈরির জন্য আবিষ্কার করা হয়নি"।
aks

2
ফিলিপরিগো তাঁর অর্থ তিনি মাঠের জন্য একজন গেটর এবং সেটটার যুক্ত করেছেন।
পল

আমি লম্বোক লাইব্রেরি ব্যবহার করি, তাই আমি কেবল অ্যাএনটেশন গেটর এবং সেটার যুক্ত করি। এবং সবকিছু ঠিক ছিল। ধন্যবাদ।
রহমত হিদায়াত

হাঁ, getters এবং setters জ্যাকসন serialization./deserialization জন্য ব্যবহার করা হয়
Ikhiloya Imokhai

25

আমার ক্ষেত্রে সমস্যাটি হ'ল জ্যাকসন কোনও গুণাবলী বা পদ্ধতি ছাড়াই একটি ফাঁকা বস্তু সিরিয়াল করার চেষ্টা করছিলেন।

ব্যতিক্রম হিসাবে প্রস্তাবিত হিসাবে খালি মটরশুটি ব্যর্থতা এড়াতে আমি নিম্নলিখিত লাইনটি যুক্ত করেছি:

জ্যাকসনের জন্য 1.9

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

জ্যাকসন ২. এক্স এর জন্য

myObjectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

আপনি জ্যাকসনকে অক্ষম ব্যর্থ_অন_ম্পটি_বিয়ানগুলিতে একটি সাধারণ উদাহরণ খুঁজে পেতে পারেন


9

একটি শিশু শ্রেণির জন্য আমার একই সমস্যা ছিল যেখানে আমার নিয়ন্ত্রণ ছিল, অবজেক্ট ম্যাপারটি একটি সাধারণ মডিউলে ছিল এবং অ্যাক্সেসযোগ্য ছিল। আমি আমার শিশু শ্রেণীর জন্য এই টীকাটি যুক্ত করে এটি সমাধান করেছি যার বিষয়টিকে সিরিয়াল করা হবে ized

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)

7

আপনি যদি সেই অবজেক্টটি সহ ক্লাসটি সম্পাদনা করতে পারেন তবে আমি সাধারণত টীকা যোগ করি

import com.fasterxml.jackson.annotation.JsonIgnore;

@JsonIgnore 
NonSerializeableClass obj;

2
যখন আপনার ক্লাসে নাম দিয়ে শুরু করার পদ্ধতি রয়েছে তখনই এই ত্রুটিটি জ্বলজ্বল করে ... উদাহরণস্বরূপ ননশিরাইজেবলক্লাস getMyNonSerializableObject ()। জ্যাকসন এটি সিরিয়াল করার চেষ্টা করে ব্যর্থ হয়। এই সমস্যাটি সমাধান করতে কেবল @ JsonIgnore যুক্ত করুন বা পদ্ধতিটির নতুন নাম দিন।
আলেক্সি পোদলাসভ

1
পুরানো সংস্করণ ব্যবহার করা হয়েছে:org.codehaus.jackson.annotate.JsonIgnore
অ্যালিকেলজিন-কিলাকা

6

আপনি যদি নিজের ফেরতের স্থিতিতে বিল্ড () পদ্ধতিটি যুক্ত করতে ভুলে যান তবে এই ত্রুটিটিও ছুঁড়ে দেওয়া হয়।

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

স্প্রিংবুট 2.0 , আমি এটি অনুসরণ কোডের মাধ্যমে সমাধান করি:

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

1
আপনার মডেলটির গিটার এবং সেটার পদ্ধতি থাকতে হবে।
জানুস

1
তাই আপনাকে স্বাগতম! অবদান রাখার জন্য ধন্যবাদ। দয়া করে আপনার উত্তরে একটি ব্যাখ্যা যুক্ত করুন, সুতরাং কোডটি কী করে, এটি কেন কাজ করে এবং কীভাবে এটি ওপিএস প্রশ্নের উত্তর দেয় তা স্পষ্ট।
ম্যাক্স ভোলার

এই আমাকে সাহায্য! তবে আমার মতে আপনার প্রসঙ্গটির অবজেক্টম্যাপার ইনজেকশন করা উচিত এবং নতুন তৈরির পরিবর্তে এটি পরে কনফিগার করা উচিত।
RoBeaToZ

3

ওরাকল জাভা অ্যাপ্লিকেশনগুলির জন্য, 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

গেটর এবং সেটার যুক্ত করার পরে

আমি মাঠের শীর্ষে @ জসনআইগনোর যুক্ত করেছি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.