@JsonProperty गुण का उपयोग कब किया जाता है और इसका उपयोग किस लिए किया जाता है?


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एनोटेशन के वास्तविक उपयोग का एक अच्छा अभी तक सरल उदाहरण है ।
OldCurmudgeon

क्या इस एनोटेशन का इस्तेमाल सदस्य के लिए किया जा सकता है Double? मैं सोच रहा था कि क्या टाइप होना चाहिए Stringया कोई भी प्रकार जो JSON का समर्थन करता है? क्या यह किसी भी प्रकार का हो सकता है? @ OldCurmudgeon
ड्रीमर

3
@ ड्रीमर हां। प्रकार अप्रासंगिक है। यह केवल नाम को प्रभावित करता है ।
ओल्डकुरुमडीन जूल 25'17

1
@ पावन - इसका नामकरण से कोई लेना-देना नहीं है। मुझे लगता है कि आपको अपने निवासियों की जांच करनी चाहिए।
ओल्डकर्मुडगंज

44

मुझे लगता है कि OldCurmudgeon और StaxMan दोनों सही हैं, लेकिन यहां आपके लिए सरल उदाहरण के साथ एक वाक्य उत्तर दिया गया है।

@JsonProperty (नाम), जैक्सन के ऑब्जेक्टमैपर को JSON प्रॉपर्टी के नाम को एनोटेट जावा फ़ील्ड के नाम से मैप करने के लिए कहता है।

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

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

क्या कक्षा का नाम JSON के मूल तत्व के समान होना चाहिए। यह मेरे लिए काम नहीं कर रहा है।
पावन

39

अब इसके लायक क्या है ... JsonProperty को ALS के लिए सामान्य क्रमांकन और डिसेरिएलाइजेशन के अलावा चर के लिए गेट्टर और सेटर विधियों को निर्दिष्ट करने के लिए उपयोग किया जाता है। उदाहरण के लिए मान लीजिए कि आपके पास इस तरह का पेलोड है:

{
  "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;
  }
}

फिर इस मामले में JsonProperty एनोटेशन को न्यूड किया जाता है। हालाँकि यदि आपके पास कक्षा में एक विधि भी है

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/JsonPropert.html


15

एनोटेशन के बिना, अनुमानित संपत्ति नाम (JSON से मिलान करने के लिए) "सेट" होगा, और ऐसा नहीं है - जैसा कि आशय लगता है - "सेट"। ऐसा इसलिए है क्योंकि जावा बीन्स विनिर्देशन के अनुसार, "isXxx" और "setXxx" फॉर्म के तरीकों का अर्थ यह लिया जाता है कि प्रबंधन करने के लिए तार्किक संपत्ति "xxx" है।


1
यह प्रश्न में दिए गए विशिष्ट मामले के लिए सही उत्तर है
एंड्रयू स्पेंसर

6

जैसा कि आप जानते हैं, यह सब एक वस्तु को क्रमबद्ध और अलंकृत करने के बारे में है। मान लीजिए कि कोई वस्तु है:

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

इस वस्तु का क्रमांकन है:

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

चर का नाम सीधे डेटा को क्रमबद्ध करने के लिए उपयोग किया जाता है। अगर आप सिस्टम एपलीकेशन से सिस्टम एपि को हटाने वाले हैं, तो कुछ मामलों में, आपको वैरिएशन / डीरिएलाइजेशन में वैरिएबल का नाम बदलना होगा। @JsonProperty, सीरियल ऑब्जेक्ट के बारे में बताने के लिए एक मेटा डेटा है। यह करने के लिए प्रयोग किया जाता है:

  • चर का नाम
  • पहुंच (पढ़ें, राइट)
  • डिफ़ॉल्ट मान
  • आवश्यक / वैकल्पिक

उदाहरण से:

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

JsonProperty को जोड़ना सुरक्षा के मामले में भी सुनिश्चित करता है कि कोई यह तय करता है कि वे संपत्ति के उन नामों में से एक को बदलना चाहते हैं जो वर्ग को प्रश्न में साकार नहीं करते हैं, उन्हें Json ऑब्जेक्ट में क्रमांकित किया जाएगा। यदि वे संपत्ति का नाम बदलते हैं तो JsonProperty सुनिश्चित करता है कि इसका उपयोग Json ऑब्जेक्ट में किया जाएगा, न कि संपत्ति के नाम पर।


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, इसलिए जैक्सन इस निर्माता का उपयोग उदाहरण बनाने के लिए करेगा। लेकिन उत्पादन की तरह है:

क्रमबद्ध: {"stringValue": "ABCD", "myEnum": "FIRST"}

थ्रेड "मुख्य" com.fasterxml.jackson.databind.exc.InvalidFormatException में अपवाद: String मान ' stringalalue ' से ClassToSerialize $ MyEnum के उदाहरण का निर्माण नहीं कर सकता : मूल्य घोषित Enum उदाहरण नामों में से एक नहीं: [FIRST, SECOND, THIRD]

लेकिन @JsonPropertyकंस्ट्रक्टर में एनोटेशन शामिल होने के बाद :

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

निर्विवाद सफल है:

सीरियल: {"myEnum": "FIRST", "stringValue": "ABCD"}

स्ट्रिंगवैल्यू: एबीसीडी

MyEnum: FIRST


2

उपरोक्त सभी उत्तरों के अलावा, दस्तावेज़ीकरण के भाग को मत भूलना जो कहता है

मार्कर एनोटेशन जिसका उपयोग किसी तार्किक स्थिति के लिए "सेटर" या "गेट्टर" के रूप में एक गैर-स्थैतिक विधि को परिभाषित करने के लिए किया जा सकता है (इसके हस्ताक्षर के आधार पर), या गैर-स्थैतिक ऑब्जेक्ट फ़ील्ड का उपयोग तार्किक (क्रमबद्ध, deserialized) के रूप में तार्किक के रूप में किया जा सकता है संपत्ति।

यदि आपके पास 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()
  • idAndUsername से getIdAndUsername*

चूंकि यह विधि तब से getIdAndUsernameशुरू होती है get, इसलिए इसे सामान्य गेट्टर माना जाता है, इसलिए आप इस तरह की टिप्पणी क्यों कर सकते हैं @JsonIgnore

यदि आपने देखा concatenateIdAndUsernameहै कि वापस नहीं लौटा है और ऐसा इसलिए है क्योंकि यह नाम से शुरू नहीं होता है getऔर यदि आप उस विधि के परिणाम को प्रतिक्रिया में शामिल करना चाहते हैं तो आप इसका उपयोग कर सकते हैं @JsonProperty("...")और इसे getter/setterउपरोक्त उल्लिखित दस्तावेज के अनुसार सामान्य माना जाएगा। ।


0

JsonProperty javadoc से,

तार्किक संपत्ति का नाम परिभाषित करता है, यानी संपत्ति के लिए JSON ऑब्जेक्ट फ़ील्ड नाम का उपयोग करें। यदि मान रिक्त है, तो स्ट्रिंग (जो डिफ़ॉल्ट है), एनोटेट किए गए फ़ील्ड के नाम का उपयोग करने का प्रयास करेगा।

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