java - রহস - প্যারিস জ্যাকসন




জেসন সহ জ্যাকসন: অস্বীকৃত ক্ষেত্র, অবহেলা হিসাবে চিহ্নিত না (20)

আমি একটি নির্দিষ্ট 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
}

আমি এই ত্রুটি পেয়ে রাখা এবং "wrapper" ফিরে null । আমি কি অনুপস্থিত তা নিশ্চিত নই। কেউ সাহায্য করতে পারেন?

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

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

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


আপনাকে শুধুমাত্র "ছাত্র" থেকে "র্যাপার" তালিকাতে কেবলমাত্র জসন ফাইলটি পরিবর্তন করতে হবে এবং ম্যাপার এটি দেখতে পাবে।


আপনার ইনপুট

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

নির্দেশ করে যে এটি একটি বস্তু, "র্যাপার" নামে একটি ক্ষেত্র, যা ছাত্রদের সংগ্রহ। তাই আমার সুপারিশ হবে,

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

যেখানে Wrapper হিসাবে সংজ্ঞায়িত করা হয়

class Wrapper {
    List<Student> wrapper;
}

আপনার জson স্ট্রিং ম্যাপড ক্লাসের সাথে ইনলাইন নয়। ইনপুট স্ট্রিং পরিবর্তন করুন

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

অথবা আপনার মানচিত্র ক্লাস পরিবর্তন

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

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

import com.fasterxml.jackson.annotation.JsonIgnoreProperties

@JsonIgnoreProperties
class { ... }

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

@JsonIgnoreProperties(ignoreUnknown = true)

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

@JsonIgnoreProperties(ignoreUnknown = true)

খুব কাজ করে নি।

শুধু যোগ কর

@JsonInclude(Include.NON_EMPTY)

জ্যাকসন 2.4.0


আমার ক্ষেত্রে এটি সহজ ছিল: REST-সেবা JSON অবজেক্টটি আপডেট করা হয়েছিল (একটি সম্পত্তি যোগ করা হয়েছিল), কিন্তু REST-client JSON অবজেক্টটি ছিল না। যত তাড়াতাড়ি আমি JSON ক্লায়েন্ট অবজেক্টটি আপডেট করেছি তা 'অস্বীকৃত ক্ষেত্র ...' ব্যতিক্রমটি অদৃশ্য হয়ে গেছে।


আমি আমার POJO ক্লাসের সেট্টার এবং গেটর পদ্ধতির স্বাক্ষরগুলি কেবল পরিবর্তন করে এই সমস্যাটি স্থির করেছি। আমাকে যা করতে হয়েছিল তা ম্যাপার যা খুঁজছেন তা মিলিয়ে পেতে getObject পদ্ধতিটি পরিবর্তন করতে হয়েছিল। আমার ক্ষেত্রে আমি মূলত একটি getImageUrl পেয়েছিলাম , কিন্তু JSON ডেটাটি চিত্র_ url ছিল যা ম্যাপার বন্ধ করে দিয়েছে। আমি IMEAGE_url এবং setImage_url পেতে আমার সেট্টার এবং getters উভয় পরিবর্তন।

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


আমি নীচের পদ্ধতি চেষ্টা করেছি এবং এটি জ্যাকসনের সাথে পড়া যেমন 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 পড়ুন

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


এই সমস্ত সম্পত্তি পড়ুন দয়া করে ভাল কাজ করে।

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 উপায়ে অর্জন করা যেতে পারে:

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

    @JsonIgnoreProperties(ignoreUnknown = true)
  2. POJO / JSON নিচের মতো সিরিয়ালাইজেশন / ডি-সিরিয়ালাইজ করে এমন ObjectMapper কনফিগার করুন:

    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.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

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

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

জেসন সম্পত্তি এবং জাভা সম্পত্তির নামগুলিতে দ্বিধা না থাকার কারণে ক্ষেত্রের ছাত্রদের নীচের হিসাবে বর্ণনা করুন

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

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

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

JSON Response এর স্কিমা থেকে ছাত্র যেমন প্রয়োজনীয় ডোমেন ক্লাসগুলি স্বয়ংক্রিয়ভাবে জেনেটিকেশে 2pojo হিসাবে ব্যবহার করার জন্য একটি বিশদ সমাধান হবে। আপনি স্কিমা রূপান্তরকারী কোন অনলাইন জson দ্বারা পরের করতে পারেন।


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

আমার মনে হয় ফিক্সটি আপনার ওয়াপার ক্লাসের ক্ষেত্রটিকে "শিক্ষার্থীদের" পরিবর্তে "মোড়ক" নামকরণ করবে।


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

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

এটি ঘোষণা করা হয় না যে সব বৈশিষ্ট্য উপেক্ষা করা হবে।


হয় পরিবর্তন করুন

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

doc মতে আপনি নির্বাচিত ক্ষেত্র বা সমস্ত বর্ধিত ক্ষেত্রগুলি উপেক্ষা করতে পারেন:

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




jackson