@ জসনপ্রপার্টি সম্পত্তি কখন ব্যবহৃত হয় এবং এটি কীসের জন্য ব্যবহৃত হয়?


181

এই শিম 'রাজ্য':

public class State {

    private boolean isSet;

    @JsonProperty("isSet")
    public boolean isSet() {
        return isSet;
    }

    @JsonProperty("isSet")
    public void setSet(boolean isSet) {
        this.isSet = isSet;
    }

}

এজ্যাক্স 'সাফল্য' কলব্যাক ব্যবহার করে তারের মাধ্যমে প্রেরণ করা হয়:

        success : function(response) {  
            if(response.State.isSet){   
                alert('success called successfully)
            }

@ জোসনপ্রপার্টি টিকাটি এখানে প্রয়োজনীয়? এটি ব্যবহার করে কী লাভ? আমি মনে করি যে কোনও পার্শ্ব প্রতিক্রিয়া তৈরি না করেই আমি এই টীকাটি সরিয়ে ফেলতে পারি।

এই annotion সম্পর্কে পড়া https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations আমি জানি না এই প্রয়োজন বোধ করা হয় ব্যবহার করা?


উত্তর:


236

এখানে একটি ভাল উদাহরণ। আমি ভেরিয়েবলটির নাম পরিবর্তন করতে এটি ব্যবহার করি কারণ JSON এমন .Netপরিবেশ থেকে আসছে যেখানে বৈশিষ্ট্যগুলি বড় হাতের অক্ষর দিয়ে শুরু হয়।

public class Parameter {
  @JsonProperty("Name")
  public String name;
  @JsonProperty("Value")
  public String value; 
}

এটি JSON এ / থেকে সঠিকভাবে পার্স করেছে:

"Parameter":{
  "Name":"Parameter-Name",
  "Value":"Parameter-Value"
}

1
স্ট্রিং সদস্যের ভেরিয়েবলগুলি কী তাদের সঠিক কেসের সাথে পুনরায় নামকরণ করা যায় না, তাই পাবলিক স্ট্রিংয়ের নাম; স্ট্রিং নাম সর্বজনীন হয়ে যায়; ?
নীল-আকাশ

14
হ্যাঁ তারা পারে তবে জাভা পরিবেশে কোডিং মানের সাথে তাদের মেলে না। এটি আমার পেডেন্ট্রি সম্পর্কে আরও একটি সত্য কোডিং ইস্যু তবে এটি টীকাটির আসল ব্যবহারের একটি ভাল তবে সহজ উদাহরণ @JsonProperty
ওল্ড কার্মিউডজিয়ন

এই টীকাটি কি ধরণের সদস্যের জন্য ব্যবহার করা যেতে পারে Double? আমি কেবল ভাবছি টাইপটি আছে Stringবা কোনও প্রকার যা জেএসওএন সমর্থন করে? এটি কোনও ধরণের হতে পারে? @ ওলডিকারমডজিয়ন
ড্রিমার

3
@ ড্রিমার হ্যাঁ প্রকারটি অপ্রাসঙ্গিক। এটি কেবলমাত্র প্রভাবিত নাম
ওল্ডরুকমুডিজিয়ন

1
@ পাভান - নামকরণের সাথে এর কোনও যোগসূত্র নেই। আমার ধারণা আপনি আপনার সেটার পরীক্ষা করা উচিত।
ওল্ড কার্মিউডজিয়ন

44

আমি মনে করি ওল্ড কার্মিউডজিয়ন এবং স্ট্যাক্সমান দুটোই সঠিক তবে এখানে আপনার পক্ষে সহজ উদাহরণ সহ একটি বাক্য উত্তর দেওয়া আছে।

@ জেসনপ্রপার্টি (নাম), জ্যাকসন অবজেক্টম্যাপারকে জেএসন সম্পত্তিটির নামটি টীকায়িত জাভা ক্ষেত্রের নামের সাথে মানচিত্র করতে বলে।

//example of json that is submitted 
"Car":{
  "Type":"Ferrari",
}

//where it gets mapped 
public static class Car {
  @JsonProperty("Type")
  public String type;
 }

শ্রেণীর নামটি কি JSON এর মূল উপাদান হিসাবে একই হওয়া উচিত। এটি আমার জন্য কাজ করছে না।
পভান

39

এখন এর মূল্য কী তা জন্য ভাল ... জেসনপ্রপার্টি হ'ল সাধারণ সিরিয়ালাইজেশন এবং ডিসরিয়ালাইজেশন বাদে চলকটির জন্য গেটর এবং সেটার পদ্ধতি নির্দিষ্ট করতে ব্যবহৃত হয়। উদাহরণস্বরূপ ধরুন আপনার এইরকম একটি পেডলোড রয়েছে:

{
  "check": true
}

এবং একটি ডিসিরিয়াইজার ক্লাস:

public class Check {

  @JsonProperty("check")    // It is needed else Jackson will look got getCheck method and will fail
  private Boolean check;

  public Boolean isCheck() {
     return check;
  }
}

তারপরে এই ক্ষেত্রে জসনপ্রপার্টি টীকাটি নেওয়া দরকার। তবে ক্লাসে আপনারও যদি কোনও পদ্ধতি থাকে

public class Check {

  //@JsonProperty("check")    Not needed anymore
  private Boolean check;

  public Boolean getCheck() {
     return check;
  }
}

এই ডকুমেন্টেশনটিও একবার দেখুন: http://fasterxML.github.io/jackson-annotations/javadoc/2.3.0/com/fasterxml/jackson/annotation/JsonProperty.html


15

টীকাগুলি ছাড়াই, অনুমানকৃত সম্পত্তির নাম (জেএসওএন থেকে মিলের জন্য) "সেট" করা হবে, এবং এটি - উদ্দেশ্য হিসাবে মনে হচ্ছে না - "ইসসেট"। এটি কারণ জাভা বিনের স্পেসিফিকেশন অনুসারে, "isXxx" এবং "সেটএক্সএক্সএক্সএক্সএক্স" ফর্মের পদ্ধতিগুলি বোঝাতে নেওয়া হয় যে ব্যবস্থাপনার জন্য লজিকাল সম্পত্তি "এক্সএক্সএক্সএক্স" আছে।


1
এইটি প্রশ্নের নির্দিষ্ট
অ্যান্ড্রু স্পেন্সার

6

আপনি কি জানেন যে, এটি কোনও বিষয়কে সিরিয়ালাইজ এবং বিশদকরণের বিষয়ে। ধরুন এখানে কোনও বস্তু রয়েছে:

public class Parameter {
  public String _name;
  public String _value; 
}

এই বস্তুর সিরিয়ালাইজেশন হ'ল:

{
  "_name": "...",
  "_value": "..."
}

ভেরিয়েবলের নাম সরাসরি ডেটা সিরিয়ালাইজ করতে ব্যবহৃত হয়। আপনি যদি সিস্টেম প্রয়োগ থেকে সিস্টেম এপিআই সরিয়ে ফেলতে চলেছেন তবে কিছু ক্ষেত্রে আপনাকে সিরিয়ালাইজেশন / ডিসরিয়ালাইজেশনে পরিবর্তনশীল নাম পরিবর্তন করতে হবে। কীভাবে সিরিয়াল অবজেক্ট করতে হয় তা সিরিয়ালাইজারকে জানাতে @ জসনপ্রপার্টি একটি মেটা ডেটা। এটি ব্যবহার করা হয়:

  • পরিবর্তনশীল নাম
  • অ্যাক্সেস (পড়ুন, লিখুন)
  • ডিফল্ট মান
  • প্রয়োজনীয় / ঐচ্ছিক

উদাহরণ থেকে:

public class Parameter {
  @JsonProperty(
        value="Name",
        required=true,
        defaultValue="No name",
        access= Access.READ_WRITE)
  public String _name;
  @JsonProperty(
        value="Value",
        required=true,
        defaultValue="Empty",
        access= Access.READ_WRITE)
  public String _value; 
}

6

জসনপ্রপার্টি যুক্ত করা সুরক্ষার বিষয়টিও নিশ্চিত করে যদি কেউ সিদ্ধান্ত নেয় যে কোনও শ্রেণির নামটি জাসন বস্তুতে সিরিয়ালিত করা হবে এমন প্রশ্নে শ্রেণিটি উপলব্ধি না করে তারা যে কোনও একটি নাম পরিবর্তন করতে চান। যদি তারা সম্পত্তিটির নাম পরিবর্তন করে তবে জসনপ্রপার্টি নিশ্চিত করে যে এটি জসন অবজেক্টে ব্যবহার করা হবে, সম্পত্তির নাম নয়।


3

অন্যান্য উত্তরগুলির পাশাপাশি, @JsonPropertyযদি আপনি @JsonCreatorক্লাসে টীকাটি ব্যবহার করেন তবে যেগুলির কোনও নন-আরগ নির্মাণকারী নেই।

public class ClassToSerialize {

    public enum MyEnum {
        FIRST,SECOND,THIRD
    }

    public String stringValue = "ABCD";
    public MyEnum myEnum;


    @JsonCreator
    public ClassToSerialize(MyEnum myEnum) {
        this.myEnum = myEnum;
    }

    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();

        ClassToSerialize classToSerialize = new ClassToSerialize(MyEnum.FIRST);
        String jsonString = mapper.writeValueAsString(classToSerialize);
        System.out.println(jsonString);
        ClassToSerialize deserialized = mapper.readValue(jsonString, ClassToSerialize.class);
        System.out.println("StringValue: " + deserialized.stringValue);
        System.out.println("MyEnum: " + deserialized.myEnum);
    }
}

এই উদাহরণে কেবলমাত্র নির্মাণকারী হিসাবে চিহ্নিত করা হয়েছে @JsonCreator, তাই জ্যাকসন এই নির্মাণকারীটিকে উদাহরণটি তৈরি করতে ব্যবহার করবেন। তবে আউটপুটটি হ'ল:

সিরিয়ালযুক্ত: {"স্ট্রিংভ্যালু": "এবিসিডি", "মাইইনাম": "প্রথম"}

থ্রেডের মধ্যে "মেইন" com.fasterxML.jackson.databind.exc.Inifications FormatException: ClassToSerialize এর উদাহরণ তৈরি করতে পারে না $ স্ট্রিংয়ের মান 'স্ট্রিংভ্যালু' থেকে MyEnum: ঘোষিত এনাম উদাহরণের নামের একটি নয়: [FIRST, SECOND, THIRD]

তবে @JsonPropertyকনস্ট্রাক্টারে টিকা যুক্ত করার পরে :

@JsonCreator
public ClassToSerialize(@JsonProperty("myEnum") MyEnum myEnum) {
    this.myEnum = myEnum;
}

Deserialization সফল:

সিরিয়ালযুক্ত: {"মাইইনাম": "FIRST", "স্ট্রিংভ্যালু": "এবিসিডি"}

স্ট্রিংভ্যালু: এবিসিডি

মাইএনম: প্রথম


2

উপরের সমস্ত উত্তর ছাড়াও, ডকুমেন্টেশনের অংশটি ভুলে যাবেন না forget

চিহ্নিতকারী টীকা যা লজিকাল সম্পত্তি (তার স্বাক্ষরের উপর নির্ভর করে) জন্য "সেটটার" বা "গেটর" হিসাবে বা স্ট্যাটাসহীন অবজেক্ট ক্ষেত্রকে (সিরিয়ালাইজড, ডিসরিয়ালাইজড) লজিকাল হিসাবে ব্যবহার করার জন্য একটি স্থিতিশীল পদ্ধতিটিকে সংজ্ঞায়িত করতে ব্যবহার করা যেতে পারে সম্পত্তি।

non-staticআপনার ক্লাসে যদি এমন কোনও পদ্ধতি থাকে যা প্রচলিত নয় getter or setterতবে আপনি এটিকে getter and setterটীকা ব্যবহার করে এটির মতো কাজ করতে পারেন । নীচে উদাহরণ দেখুন

public class Testing {
    private Integer id;
    private String username;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getIdAndUsername() {
        return id + "." + username; 
    }

    public String concatenateIdAndUsername() {
        return id + "." + username; 
    }
}

উপরের অবজেক্টটি সিরিয়ালযুক্ত করা হলে প্রতিক্রিয়াটি অন্তর্ভুক্ত থাকবে

  • থেকে ব্যবহারকারীর নাম getUsername()
  • থেকে আইডি getId()
  • getIdAndUsername* থেকে আইডিএন্ড ব্যবহারকারীর নাম

যেহেতু পদ্ধতিটি getIdAndUsernameশুরু হয় getতারপরে এটি এটিকে সাধারণ গেটর হিসাবে বিবেচনা করা হয়, আপনি কেন এটির সাথে মন্তব্য করতে পারেন @JsonIgnore

আপনি যদি খেয়াল করে থাকেন concatenateIdAndUsernameযে এটি ফিরে না পেয়েছে এবং কারণ এটির নামটি শুরু হয় না getএবং যদি আপনি সেই পদ্ধতির ফলাফলটিকে প্রতিক্রিয়াতে অন্তর্ভুক্ত করতে চান তবে আপনি ব্যবহার করতে পারেন @JsonProperty("...")এবং এটি getter/setterউপরের হাইলাইট ডকুমেন্টেশনে উল্লিখিত হিসাবে স্বাভাবিক হিসাবে বিবেচিত হবে ।


0

জসনপ্রপার্টি জাভাদোক থেকে,

যৌক্তিক সম্পত্তির নাম, যেমন JSON অবজেক্ট ক্ষেত্রের নামটি সম্পত্তিটির জন্য ব্যবহার করার জন্য সংজ্ঞা দেয়। মানটি যদি খালি থাকে তবে স্ট্রিং (যা পূর্বনির্ধারিত), উল্লেখ করা ক্ষেত্রটির নাম ব্যবহার করার চেষ্টা করবে।

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