জ্যাকসন সহ জ্যাকসন: অচেনা ক্ষেত্র, অজ্ঞাত হিসাবে চিহ্নিত নয়


675

আমার একটি নির্দিষ্ট জেএসএন স্ট্রিংটিকে জাভা অবজেক্টে রূপান্তর করতে হবে। আমি জ্যাকসনকে জেএসএন হ্যান্ডলিংয়ের জন্য ব্যবহার করছি। জেএসওএন ইনপুটটির উপর আমার কোনও নিয়ন্ত্রণ নেই (আমি একটি ওয়েব পরিষেবা থেকে পড়েছি)। এটি আমার ইনপুট জেএসওএন:

{"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
জেএসএনের মতো দেখতে হবে: স্ট্রিং জসনএসটিআর = "{\" শিক্ষার্থী \ "\: [{\" আইডি \ ": \" 13 \ ", \" নাম \ ": F" ফ্রেড \ "}]}"; আপনি যদি আপনার বিশ্রামের পোস্টের অনুরোধে
র্যাপার

2
সম্পর্কিত (তবে পৃথক) প্রশ্ন: জ্যাকসন ব্যবহার করে
জেএসএন

5
এবং ঘটনাক্রমে, এই প্রশ্নের বেশিরভাগ উত্তর আসলে একটি পৃথক প্রশ্নের উত্তর দেয়, যাকে আমি উপরে উল্লিখিত প্রশ্নের অনুরূপ।
sleske

4
উত্তরগুলির বেশিরভাগই ব্রাশের সমস্যাটিকে আসলে সমস্যার সমাধানের চেয়ে
কম্বত্যের নীচে সহায়তা

উত্তর:


990

আপনি জ্যাকসনের শ্রেণি-স্তরের টিকাটি ব্যবহার করতে পারেন:

import com.fasterxml.jackson.annotation.JsonIgnoreProperties

@JsonIgnoreProperties
class { ... }

এটি আপনার POJO এ সংজ্ঞায়িত না করে এমন প্রতিটি সম্পত্তি উপেক্ষা করবে। আপনি যখন জেএসএন-তে বেশ কয়েকটি সম্পত্তি অনুসন্ধান করছেন এবং পুরো ম্যাপিংটি লিখতে চান না তখন খুব দরকারী। জ্যাকসনের ওয়েবসাইটে আরও তথ্য । আপনি যদি ঘোষিত কোনও সম্পত্তি উপেক্ষা করতে চান তবে আপনার লিখতে হবে:

@JsonIgnoreProperties(ignoreUnknown = true)

9
এরিয়েল, ক্লাসে এই বাহ্যিক ঘোষণার কোনও উপায় আছে কি?
জন লরাসু

4
আমি যে ক্লাসিকগুলির নিজস্ব নই সেগুলি সিরিয়ালাইজ করছি (পরিবর্তন করতে পারি না)। এক দৃষ্টিতে, আমি ক্ষেত্রগুলির একটি নির্দিষ্ট সেট দিয়ে ক্রমিক করতে চাই। অন্য দৃশ্যে, আমি সিরিয়ালযুক্ত ক্ষেত্রগুলির একটি আলাদা সেট চাই (বা সম্ভবত JSON- এ বৈশিষ্ট্যগুলির নাম পরিবর্তন করব)।
জন লরুসো

11
আমি অবশ্যই যুক্ত করব যে (ignoreUnknown = true)আপনার ক্লাসটি বর্নিত করার সময় আপনার প্রয়োজন হবে অন্যথায় এটি কাজ করবে না
necromancer

85
জুলাইন, এটি ওপি-র প্রশ্নের সঠিক উত্তর নয়। যাইহোক, আমি সন্দেহ করি যে লোকেরা এখানে আসে কারণ তারা গুগল করে যে কীভাবে পজোতে সংজ্ঞায়িত বৈশিষ্ট্যগুলিকে উপেক্ষা করা যায় এবং এটিই প্রথম ফলাফল, তাই তারা এটিকে এবং সুরেশের প্রতিক্রিয়াটি শেষ করে (আমার কী হয়েছিল)। যদিও অপরিজ্ঞাত বৈশিষ্ট্যগুলি উপেক্ষা করার ইচ্ছের সাথে মূল প্রশ্নের কোনও সম্পর্ক নেই।
রিক জাফে

5
এটি খুব মূর্খ ডিফল্ট সেটিংস ইমো, আপনি যদি নিজের এপিআই-তে কোনও সম্পত্তি যুক্ত করেন তবে পুরো সিরিয়ালাইজেশন ব্যর্থ হয়
হেডসভেকে

478

তুমি ব্যবহার করতে পার

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

এটি ঘোষিত নয় এমন সমস্ত সম্পত্তি উপেক্ষা করবে।


5
এটি আমার পক্ষে কাজ করে নি, এটি এখনও অজানা সম্পত্তিগুলিতে ব্যর্থ হয়
ডেনিস নিয়াজহেভ

1
আপনি কি করছেন ঠিকঠাক কোডের এক টুকরো টুকরো টিকিয়ে দিতে, দয়া করে আপনি সেখানে কিছু মিস করে থাকতে পারেন .. হয় এটি করে বা "@ জাসনআইগনোপ্রপ্রেটিস (উপেক্ষা-অজানা = সত্য)" ব্যবহার করে আপনার সমস্যার সমাধান করা উচিত। যাই হোক শুভকামনা।
সুরেশ

27
Org.codehaus.jackson.map.DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES: - FWIW আমি এই কিছুটা ভিন্ন enum আমদানি করতে ছিল
RAF

9
Ove উপরে জ্যাকসন সংস্করণগুলির জন্য 2
755

10
GetObjectMapper () নিষ্ক্রিয় (DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES): আপনি পছন্দ করতে এই কল চেইন পারবেন না।
icfantv

126

প্রথম উত্তরটি প্রায় সঠিক, তবে যা প্রয়োজন তা হল গিটার পদ্ধতি পরিবর্তন করা, ক্ষেত্র নয় - ক্ষেত্রটি ব্যক্তিগত (এবং স্বয়ংক্রিয়ভাবে সনাক্ত করা হয়নি); তদ্ব্যতীত, উভয়ই দৃশ্যমান হলে ক্ষেত্রগুলির তুলনায় প্রাপ্তদের অগ্রাধিকার রয়েছে private

সুতরাং গেটারের নামকরণ করা উচিত getWrapper(), বা এর সাথে টিকা দেওয়া উচিত :

@JsonProperty("wrapper")

আপনি যদি গেটর পদ্ধতির নামটি পছন্দ করেন।


দয়া করে বিশদভাবে বলুন - কোন গিটারটি পরিবর্তন করা বা টিকা দেওয়া দরকার?
ফ্রান্স

আপনার অর্থ @ জেসনগেটর ("র‍্যাপার") দিয়ে টীকাযুক্ত, তাই না?
পেডরাম বাশিরি

@ পিদ্রামবাশিরি না, মানে @JsonProperty। যদিও @JsonGetterআইনী উপনাম, এটি @JsonPropertyগ্রাহক, সেটার এবং ক্ষেত্রের জন্য খুব কমই ব্যবহৃত হয় ; সেটার এবং গেটারদের স্বাক্ষর দ্বারা পৃথক করা যায় (কেউ কোনও যুক্তি গ্রহণ করে না, বাতিল করে দেয়; অন্যটি একটি যুক্তি নেয়)।
স্ট্যাক্সমান

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

90

জ্যাকসন ২.6.০ ব্যবহার করে এটি আমার পক্ষে কাজ করেছে:

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

এবং সেটিং সহ:

@JsonIgnoreProperties(ignoreUnknown = true)

12
সেই কনফিগার টীকাটি অপ্রয়োজনীয়
19'9 এ নিউইর্ল্ড

আপনার কি ক্লাসে অবজেক্টম্যাপার এবং টিকা দুটি কনফিগার করতে হবে? আমার ধারণা, অবজেক্টম্যাপার প্রতিটি ক্লাসকে টিকিয়ে রাখার প্রয়োজন ছাড়াই সবার জন্য ঠিক করে দেবে। যদিও আমি টীকাটি ব্যবহার করি।

আপনার একই ক্লাসে উভয় সেটিংসের দরকার নেই। আপনি বিশ্বব্যাপী সম্পত্তি ObjectMapperসেট করার জন্য ডিআই-র একটি বিশ্বব্যাপী সিঙ্গলটন উদাহরণ পেতে ব্যবহার করতে পারেন FAIL_ON_UNKNOWN_PROPERTIES
ব্যবহারকারী 991710

আপনার উভয়েরই দরকার নেই, আপনি একটি বা অন্যটি চয়ন করতে পারেন।
হিজ 17

58

এটি 2 উপায়ে অর্জন করা যেতে পারে:

  1. অজানা বৈশিষ্ট্য উপেক্ষা করার জন্য POJO চিহ্নিত করুন

    @JsonIgnoreProperties(ignoreUnknown = true)
  2. অবজেক্টম্যাপার কনফিগার করুন যা নীচে 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
কেন এটি গ্রহণযোগ্য উত্তর হওয়া উচিত? এটি কেবল অজানা বৈশিষ্ট্যগুলিকে উপেক্ষা করতে বলেছে, যেখানে প্রশ্নটি ছিল জসনকে কোনও বস্তুতে আবৃত করার জন্য কোনও উপায় যা এই সমাধানটি পরিষ্কারভাবে উপেক্ষা করতে বলে to
সায়ন্তন

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

আশানুরূপ কাজ করা!
মাধায়ান এম

হ্যাঁ, এটিই আমার সমস্যা সমাধান করেছে - যা এই পোস্টের শিরোনামের সাথে মেলে।
স্কট ল্যাঞ্জবার্গ

উত্তরগুলি আমার পক্ষে ভাল কাজ করে এবং এটি খুব সহজ you আপনাকে ধন্যবাদ
Akira

29

আপনি যদি জ্যাকসন ২.০ ব্যবহার করেন

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

কেন এই কনফিগারেশনের আমার জন্য কোনও প্রভাব নেই?
zhaozhi

@ ঝাজোহি এটি জ্যাকসন সংস্করণ
আলখোদিরি

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

সেটটার এবং গিটারগুলি যুক্ত করে সমস্যার সমাধান করা , আমি যা অনুভব করেছি তা হ'ল আসল সমস্যাটি কীভাবে সমাধান করবেন তবে কীভাবে ত্রুটিটি দমন / উপেক্ষা করবেন তা নয়। আমি ত্রুটি পেয়েছি " অজানা ক্ষেত্র .. অজ্ঞান হিসাবে চিহ্নিত করা হয়নি .. "

যদিও আমি ক্লাসের উপরে নীচের টীকাগুলি ব্যবহার করি এটি জাসন বস্তুটি পার্স করতে এবং আমাকে ইনপুট দিতে সক্ষম হয় নি

নিবন্ধন করুন

তারপরে আমি বুঝতে পেরেছিলাম যে আমি "র‍্যাপার" এবং "ছাত্র" - এ সেটর এবং গেটার যুক্ত করার পরে আমি সেটটার এবং গেটার যুক্ত করি নি, এটি একটি কবজির মতো কাজ করেছে।


এটিই কেবলমাত্র উত্তর বলে মনে হচ্ছে যা আসলে প্রশ্নের উত্তর দেয়। অন্য সমস্ত উত্তরগুলি কেবল অজানা বৈশিষ্ট্যগুলিকে অগ্রাহ্য করা হিসাবে চিহ্নিত করছে, কিন্তু 'মোড়ক' একটি অজানা সম্পত্তি নয়, এটি আমরা বিশ্লেষণের চেষ্টা করছি।
lbenedetto

14

জ্যাকসন অভিযোগ করছেন কারণ এটি আপনার ক্লাস র‍্যাপারে এমন একটি ক্ষেত্র খুঁজে পাচ্ছে না যার নাম "র‌্যাপার"। এটি এটি করছে কারণ আপনার JSON অবজেক্টটিতে "র‌্যাপার" নামে একটি সম্পত্তি রয়েছে।

আমি মনে করি এই ফিক্সটি হ'ল আপনার র্যাপার ক্লাসের ক্ষেত্রটির নাম "শিক্ষার্থী" পরিবর্তে "র‍্যাপার" করা হবে।


ধন্যবাদ জিম আমি এটি চেষ্টা করেছিলাম এবং এটি সমস্যার সমাধান করে নি। আমি ভাবছি যদি আমি কিছু
টিকাটি

1
হুম, আপনি যখন জাভাতে সমতুল্য ডেটা তৈরি করেন এবং তারপরে জ্যাকসনকে এটি JSON এ লিখতে ব্যবহার করেন তখন কী হয়। উপরের JSON এবং JSON এর মধ্যে যে কোনও পার্থক্য হ'ল কী ঘটছে তার একটি সূত্র হওয়া উচিত।
জিম ফেরানস

এই উত্তরটি প্রশ্নটির উদাহরণ সহ আমার পক্ষে কাজ করেছিল।
sleske

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 দেখুন

আশাকরি এটা সাহায্য করবে


স্ট্যাকওভারফ্লোতে স্বাগতম। টিপ, {}আপনার কোড স্নিপেটগুলি ফর্ম্যাট করতে আপনি সরঞ্জাম বারে চিহ্নগুলি ব্যবহার করতে পারেন ।
লেই

11

জসন স্ট্রিমগুলি পড়ার সময় এই সমাধানটি জেনেরিক হয় এবং আপনার ডোমেন ক্লাসে ক্ষেত্রগুলি সঠিকভাবে ম্যাপ না করা অবস্থায় কেবল কয়েকটি ক্ষেত্র পাওয়ার দরকার হয়:

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

Jsonschema2pojo এর মতো একটি ডিভাইস ব্যবহার করার জন্য একটি বিস্তৃত সমাধান হ'ল জসন রেসপন্সের স্কিমা থেকে শিক্ষার্থী হিসাবে প্রয়োজনীয় ডোমেন ক্লাসগুলি স্বয়ংক্রিয়ভাবে তৈরি করতে। আপনি যেকোন অনলাইন জেসন দ্বারা স্কিমা রূপান্তরকারী করতে পারেন।


10

মাঠের শিক্ষার্থীদের নীচে হিসাবে এনটেট করুন যেহেতু জসন সম্পত্তি এবং জাভা সম্পত্তির নামে মিল নেই

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

9

অন্য কেউ যেমন উল্লেখ করেনি, ভেবেছিলাম আমি ...

সমস্যাটি আপনার জেএসএনে আপনার সম্পত্তি যা "র‌্যাপার" এবং র‌্যাপার.ক্লাসে থাকা আপনার সম্পত্তিটিকে "শিক্ষার্থী" বলা হয়।

সুতরাং হয় ...

  1. শ্রেণীর বা জেএসএনের যে কোনও একটিতে সম্পত্তিটির নাম সংশোধন করুন।
  2. স্টেক্সম্যানের মন্তব্য অনুসারে আপনার সম্পত্তি ভেরিয়েবলকে টীকা দিন।
  3. সেটারটি এনেটেট করুন (যদি আপনার কাছে থাকে)

6

আপনার শ্রেণীর ক্ষেত্রগুলি বেসরকারী নয় জনসাধারণকে সেট করুন ।

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

2
খারাপ অনুশীলন - এটি এনকেপসুলেশন ভেঙে দেয়।
ডাউনহিলসকি

1
আমি শুনেছি।
ডাউনহিলসকি

আপনার ক্লাসটি ঝুঁকির মধ্যে রয়েছে যখন ব্যবহারকারী এটি ব্যবহার করে কারণ অভ্যন্তরীণ অবস্থা এই ক্ষেত্রগুলির মাধ্যমে পরিবর্তিত হতে পারে।
ডাউনহিলসকি

5

আমার জন্য যা কাজ করেছিল তা ছিল সম্পত্তি জনসাধারণের কাছে করা। এটি আমার জন্য সমস্যার সমাধান করেছে।


1
আমার জন্য কাজ করেছেন: ডি
টিয়েনলুং

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] :

আপনার জাভা মডেল অবজেক্টগুলি আপডেট করুন

২.x এসডিকে মতো, ফায়ারবেস ডাটাবেসগুলি আপনি যে জাভা অবজেক্টগুলিকে DatabaseReference.setValue()JSON এ পাঠিয়েছেন তা স্বয়ংক্রিয়ভাবে রূপান্তরিত করবে এবং JSON ব্যবহার করে জাভা অবজেক্টগুলিতে ব্যবহার করতে পারবে DataSnapshot.getValue()

নতুন এসডিকে, JSON এর সাথে জাভা অবজেক্টে পড়ার সময়, JSON এ DataSnapshot.getValue()অজানা বৈশিষ্ট্যগুলি এখন ডিফল্টরূপে উপেক্ষা করা হবে যাতে আপনার আর প্রয়োজন হয় না @JsonIgnoreExtraProperties(ignoreUnknown=true)

জেএসএন-তে জাভা অবজেক্ট লেখার সময় ক্ষেত্র / গিটারগুলি বাদ দেওয়ার জন্য, এনোটেশনটি এখন @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)

আপনার জাভা ক্লাসে নেই এমন যদি আপনার জেএসওনে কোনও অতিরিক্ত সম্পত্তি থাকে তবে আপনি লগ ফাইলগুলিতে এই সতর্কতাটি দেখতে পাবেন:

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

আপনি @IgnoreExtraPropertiesআপনার ক্লাসে একটি টিকা দিয়ে এই সতর্কতা থেকে মুক্তি পেতে পারেন । আপনি যদি ফায়ারবেস ডাটাবেসটিকে 2.x এসডিকে যেমন ব্যবহার করতে চান এবং অজানা সম্পত্তি থাকে তবে একটি ব্যতিক্রম ছুঁড়ে ফেলতে চান, আপনি @ThrowOnExtraPropertiesনিজের শ্রেণিতে একটি টিকা দিতে পারেন ।


4

আমার অংশের জন্য, একমাত্র লাইন

@JsonIgnoreProperties(ignoreUnknown = true)

খুব একটা কাজ হয়নি।

শুধু যোগ কর

@JsonInclude(Include.NON_EMPTY)

জ্যাকসন ২.৪.০


4

এটি আমার জন্য পুরোপুরি কাজ করেন

objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

4

আমি কেবল আমার সেটারের স্বাক্ষর এবং আমার POJO ক্লাসের গেটর পদ্ধতির পরিবর্তন করে এই সমস্যাটি সমাধান করেছি। আমাকে যা করতে হয়েছিল তা হ'ল ম্যাপার কী খুঁজছিল তা মেলানোর জন্য getObject পদ্ধতিটি পরিবর্তন করতে হয়েছিল । আমার ক্ষেত্রে আমার কাছে প্রাথমিকভাবে একটি getImageUrl ছিল , তবে জেএসওএন ডেটাতে ইমেজ_আর্ল ছিল যা ম্যাপারটিকে ফেলে দিচ্ছে। আমি আমার সেটার এবং গেটরস উভয়কেই আইটেম_আরল এবং সেট ইমেজ_আরলে পরিবর্তন করেছি

আশাকরি এটা সাহায্য করবে.


আপনি আপাতদৃষ্টিতে ঠিক বলেছেন: আপনি যে নামটি চান তা xxx_yyy এটিকে কল করার উপায়টি getXxx_yyy এবং সেটএক্সএক্সএক্সএক্সএক্সএক্স_ইই হবে। এটি খুব আশ্চর্যজনক তবে এটি কাজ করে।
সিভি

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
ফ্রান্সে

@ ফ্রান্স হাহা, ত্রুটিটি ধরার জন্য আপনাকে ধন্যবাদ। আমি সংগ্রহের জন্য প্রাকৃতিকভাবে বহুবচন ব্যবহার করি। তবে ওপি-র প্রশ্ন অনুযায়ী এটি একবচন হওয়া উচিত।
দিনো টো

3

এটি খুব দেরিতে প্রতিক্রিয়া হতে পারে, তবে কেবল POJO এ পরিবর্তন করার ফলে সমস্যার প্রদত্ত জসন স্ট্রিংটি সমাধান করা উচিত (যেহেতু, আপনি যেমন বলেছেন ইনপুট স্ট্রিংটি আপনার নিয়ন্ত্রণে নেই):

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

3

আর একটি সম্ভাবনা হ'ল অ্যাপ্লিকেশন.সম্পত্তিগুলির এই সম্পত্তি spring.jackson.deserialization.fail-on-unknown-properties=false, যা আপনার আবেদনে অন্য কোনও কোড পরিবর্তনের প্রয়োজন হবে না। এবং যখন আপনি বিশ্বাস করেন যে চুক্তিটি স্থিতিশীল, আপনি এই সম্পত্তিটি সরাতে পারেন বা এটি সত্য হিসাবে চিহ্নিত করতে পারেন।


3

ওপি-র সমস্যাটি একই রকম নাও হতে পারে তবে যদি কেউ আমার মতো ভুলের সাথে এখানে আসে তবে এটি তাদের সমস্যা সমাধানে সহায়তা করবে। আমি যখন জসনপ্রপার্টি টীকা হিসাবে আলাদা নির্ভরতা থেকে একটি অবজেক্টম্যাপার ব্যবহার করি তখন ওপি হিসাবে একই ত্রুটি পেয়েছি।

এইটা কাজ করে:

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

গুগল আমাকে এখানে এনেছে এবং আমি উত্তরগুলি দেখে অবাক হয়ে গিয়েছিলাম ... সমস্ত ত্রুটিটি বাইপাস করার পরামর্শ দিয়েছিল ( যা সর্বদা উন্নতিতে 4 ভাঁজ পিছনে দংশিত হয় ) যতক্ষণ না এই ভদ্রলোক এস.এ. বিশ্বাসের দ্বারা পুনরুদ্ধার না করা পর্যন্ত সমাধান না করে!

objectMapper.readValue(responseBody, TargetClass.class)

একটি জেসন স্ট্রিংকে একটি শ্রেণীর অবজেক্টে রূপান্তর করতে ব্যবহার করা হয়, যা অনুপস্থিত তা হ'ল TargetClassপাবলিক getটের / setটায়ার থাকতে হবে। ওপির প্রশ্নের স্নিপেটেও একই অনুপস্থিত! :)

লম্বোকের মাধ্যমে আপনার ক্লাসটি নীচের মতো কাজ করা উচিত !!

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

2

com.fasterxml.jackson.annotation.JsonIgnoreProperties আমদানি করুন;

@JsonIgnoreProperties


হতে পারে আরও কিছু ব্যাখ্যা বা ডক ভাল লাগবে
বেঞ্জ

@ জসনআইগনোর প্রপার্টিগুলি (উপেক্ষা করুন = অজ্ঞাতসারে) ভাল কাজ করে, ধন্যবাদ
গিলহর্ম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.