2012-03-16 13 views
28

निम्नलिखित जाक्स-बी एनोटेशन के लिए जैक्सन जेसन एनोटेशन में समतुल्य तरीका क्या है?JSON फ़ील्ड नामों को विभिन्न ऑब्जेक्ट फ़ील्ड नामों पर कैसे मैप करें?

मुझे एक्सएमएल की बजाय जेसन का उत्पादन करने की आवश्यकता है और पारंपरिक जैक्सन एनोटेशन को जानने की जरूरत है जो जैक्स-बी में समान रूप से दर्शाया गया है।

  1. एक फ़ील्ड का नाम बदलें।
  2. फ़ील्ड के बजाय गेटर्स का उपयोग करें।

इन सुविधाओं आदि विशेष रूप से महत्वपूर्ण है, तो JSON/XML तत्व नाम की तरह "new", "public" एक जावा आरक्षित शब्द है कर रहे हैं "static",

तो हम नाम के लिए है पीओजेओ फ़ील्ड्स "_new_", "_public_", "_static_", आदि क्रमशः

लेकिन उन्हें "नया", "सार्वजनिक", "स्थैतिक", आदि में नाम बदलने के लिए जैक्स-बी एनोटेशन का उपयोग करें जेनरेट एक्सएमएल (और जेसन) तत्व।

संपत्ति गेटर का उपयोग कर (मुझे लगता है कि यह है कि यह कैसे JAX-ख में किया जाता है)

@XmlAccessorType(XmlAccessType.PROPERTY) 
public class Person{ 
    protected String name; 
    protected String address; 
    protected boolean _restricted_ ; 
    protected boolean _new_ ; 

    @XmlElement(required = true) 
    protected String getName() {return name;} 
    @XmlElement(required = true) 
    protected String getAddress() {return address;} 
    @XmlElement(name = "contractor") 
    protected boolean getRestricted() {return _restricted_;} 
    @XmlElement(name = "new") 
    protected boolean getNew(){return _new_;} 
} 
+0

करता है '@XmlElement (नाम =" नया ")' आपके लिए काम नहीं? मैंने बस जर्सी सर्वलेट (जो जैक्सन का उपयोग करता है) पर कोशिश की और यह ठीक काम किया। – Danny

+0

मैं RestyGWT का उपयोग कर रहा हूं - मुझे लगता है कि यह सुविधा RestyGWT में नहीं मिली है और इसलिए मुझे पैच सबमिट करने/प्रस्तावित करने से पहले जैक्सन इक्विव को जानने की आवश्यकता है। संकेत के लिए –

+0

धन्यवाद @ बेस्डगेक। Http://wiki.fasterxml.com/AnnotationIntrospector पर अधिक जानकारी मिल सकती है लिंक के तरीके में थोड़ा सा पुराना है, मैं इस कोड का उपयोग serializer/deserializer की प्राथमिकता को सेट करने के लिए कर रहा हूं। objectMapper.setAnnotationIntrospector ( नई AnnotationIntrospectorPair ( नई JacksonAnnotationIntrospector(), नई JaxbAnnotationIntrospector() ) ); – aheryan

उत्तर

69

शायद यह एक सा करने के लिए एक क्षेत्र

@XmlAccessorType(XmlAccessType.FIELD) 
public class Person{ 
    @XmlElement(required = true) 
    protected String name; 
    @XmlElement(required = true) 
    protected String address; 
    @XmlElement(name = "contractor") 
    protected boolean _restricted_ ; 
    @XmlElement(name = "new") 
    protected boolean _new_ ; 
} 

पुनर्निर्देशन का नाम बदल रहा देर से लेकिन वैसे भी ..

आप एक संपत्ति का नाम बदल सकते हैं बस

@JsonProperty("contractor") 

और डिफ़ॉल्ट रूप से जैक्सन गेटटर और सेटर को क्रमबद्ध करने और deserialize करने के लिए उपयोग करें।

अधिक विस्तृत जानकारी के लिए: http://wiki.fasterxml.com/JacksonFAQ

+2

क्या मैं इस ** @ जेसनप्रोपर्टी ** कक्षा वर्ग के भीतर एनोटेशन का उपयोग कर सकता हूं जो पहले से ही ** @ XmlElement ** के साथ एनोटेटेड है?मैंने इस तरह के गुणों के मूल्यों को ओवरराइड करने का प्रयास किया: '@JsonProperty (value =" json_Name ") @XmlElement (name =" name_provider ") सार्वजनिक स्ट्रिंग getName() { वापसी का नाम; } ' लेकिन वैसे भी मेरा नाम का नाम ** name_provider ** है, नहीं ** json_Name ** – Nikolas

+2

हां, भले ही यह काम करता है 'एनोटेशन इंट्रोस्पेक्टर के शामिल (जैक्सन के स्वयं बनाम जेएक्सबी) की प्राथमिकता पर निर्भर करता है। दोनों का पता लगाया जाएगा, लेकिन उच्च प्राथमिकता "जीत" के साथ पंजीकृत एक। संकेत के लिए – StaxMan

+0

धन्यवाद @StaxMan। मैंने प्राथमिकता निर्धारित करने के लिए [यहां] (http://wiki.fasterxml.com/AnnotationIntrospector) कोडिंग का उपयोग किया है – aheryan

संबंधित मुद्दे