2012-09-25 28 views
96

यह सेम 'स्थिति':@JsonProperty प्रॉपर्टी का उपयोग कब किया जाता है और इसके लिए क्या उपयोग किया जाता है?

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

एनोटेशन यहाँ आवश्यक @JsonProperty है:

public class State { 

    private boolean isSet; 

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

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

} 

तार ajax 'सफलता' कॉलबैक का उपयोग करने पर भेज दिया जाता है? इसका उपयोग करने का क्या फायदा है? मुझे लगता है कि मैं इस एनोटेशन को बिना साइड इफेक्ट्स के हटा सकता हूं।

https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations पर इस वर्ष के बारे में पढ़ना मुझे नहीं पता कि इसका उपयोग कब किया जाना चाहिए?

+0

wiki.fasterxml.com लिंक टूटा हुआ है – JohnK

उत्तर

126

यहां एक अच्छा उदाहरण है। मैं इसे चर का नाम बदलने के लिए उपयोग करता हूं क्योंकि JSON .Net वातावरण से आ रहा है जहां गुण ऊपरी-केस अक्षर से शुरू होते हैं।

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

यह सही ढंग से पार्स करने के लिए/JSON से:

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

क्या स्ट्रिंग सदस्य चर का नाम बदलकर उनके सही मामले में नहीं बदला जा सकता है, इसलिए सार्वजनिक स्ट्रिंग नाम; सार्वजनिक स्ट्रिंग नाम बन जाता है; ? –

+7

हां वे कर सकते हैं, लेकिन जावा वातावरण में जो उन्हें कोडिंग मानकों से मेल नहीं खाता है। यह मेरे पैडेंट्री के बारे में अधिक है कि वास्तविक कोडिंग समस्या है, लेकिन यह '@ जेसनप्रोपर्टी' एनोटेशन के वास्तविक उपयोग का एक अच्छा लेकिन सरल उदाहरण है। – OldCurmudgeon

+0

क्या इस एनोटेशन का उपयोग 'डबल' प्रकार के सदस्य के लिए किया जा सकता है? मैं बस सोच रहा हूं कि क्या प्रकार 'स्ट्रिंग' या किसी भी प्रकार का JSON समर्थन होना चाहिए? क्या यह किसी भी प्रकार का हो सकता है? @OldCurmudgeon – Dreamer

9
एनोटेशन, अनुमानित संपत्ति नाम (JSON से मिलान करने के लिए) होगा "सेट" जा बिना

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

24

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

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

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

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

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

20

अच्छी तरह से क्या अब इसके लायक के लिए ... JsonProperty भी हमेशा की तरह क्रमबद्धता और अक्रमांकन से अलग चर के लिए मनुष्य और सेटर तरीके निर्दिष्ट करने के लिए प्रयोग किया जाता है।

{ 
    "check": true 
} 

और एक deserializer वर्ग:

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 एनोटेशन neeeded है उदाहरण के लिए आप इस तरह एक पेलोड है लगता है। http://fasterxml.github.io/jackson-annotations/javadoc/2.3.0/com/fasterxml/jackson/annotation/JsonProperty.html

3

कि आप जानते हैं, यह सब serialize के बारे में है और एक वस्तु desalinize: लेकिन यदि आप भी वर्ग

public class Check { 

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

    public Boolean getCheck() { 
    return check; 
    } 
} 

में एक विधि है भी इस दस्तावेज़ पर एक नज़र डालें। मान लीजिए एक वस्तु है:

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

इस वस्तु की क्रमबद्धता है:

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

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

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

उदाहरण से:

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; 
} 
0

से जेसनप्रोपर्टी जावाडोक,

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

0

अन्य उत्तर के अलावा के रूप में, @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": "एबीसीडी", "myEnum": "सबसे पहले"}

सूत्र में अपवाद "मुख्य" com.fasterxml.jackson.databind .exc.InvalidFormatException: स्ट्रिंग मान 'stringValue' से की com.avl.mbdtool.verificationmodule.exceptiondocument.ClassToSerialize $ उदाहरण MyEnum का निर्माण नहीं कर सकते हैं: मूल्य घोषित नहीं किया Enum उदाहरण नामों में से एक: [पहले, SECOND, THIRD ]

लेकिन निर्माता में @JsonProperty एनोटेशन के अलावा के बाद:

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

अक्रमांकन सफल हुआ:

धारावाहिक: { "myEnum": "सबसे पहले", "stringValue": " एबीसीडी "}

StringValue: एबीसीडी

MyEnum: सबसे पहले

+०१२३५१६४१०६१
संबंधित मुद्दे