जैक्सन का उपयोग करके JSON में फ़ील्ड नाम कैसे बदलें


169

मैं जैक्सन का उपयोग कर रहा हूं ताकि खान की एक वस्तु को जसन में परिवर्तित किया जा सके। ऑब्जेक्ट में 2 फ़ील्ड हैं:

@Entity
public class City {
   @id
   Long id;
   String name;
   public String getName() { return name; }
   public void setName(String name){ this.name = name; }
   public Long getId() { return id; }
   public void setName(Long id){ this.id = id; }
}

चूँकि मैं jQuery ऑटो पूर्ण सुविधा के साथ इसका उपयोग करना चाहता हूं, मैं चाहता हूं कि 'id', 'मान' के रूप में प्रकट हो और 'नाम' 'लेबल' के रूप में प्रकट हो। जैक्सन के प्रलेखन इस पर स्पष्ट नहीं है और मैं हर एनोटेशन की कोशिश की है कि यहां तक कि दूर से लगता है जैसे कि यह मैं क्या आवश्यकता है, लेकिन मैं नहीं मिल सकता है nameके रूप में प्रकट करने के लिए labelऔर idके रूप में प्रकट करने के लिए valuejson में।

क्या किसी को पता है कि यह कैसे करना है या यदि यह संभव है?


यदि आप कभी भी किसी अन्य उद्देश्य या व्यावसायिक तर्क के लिए इकाई ("शहर") का उपयोग करने जा रहे थे, तो मैं इसके JSON प्रतिनिधित्व को लेबल और मान के रूप में परिभाषित करने से बचूंगा। OTOH अगर यह विशुद्ध रूप से कॉम्बो के लिए उपयोग किया जाने वाला संदर्भ डेटा है, तो आप संभवतः अधिक होने जा रहे हैं - इन सभी को कवर करने के लिए एक सामान्य इकाई (जोड़ी या विकल्प) बनाना एक संभावित दृष्टिकोण है।
थॉमस डब्ल्यू

जवाबों:


323

क्या आपने @JsonProperty का उपयोग करने की कोशिश की है?

@Entity
public class City {
   @id
   Long id;
   String name;

   @JsonProperty("label")
   public String getName() { return name; }

   public void setName(String name){ this.name = name; }

   @JsonProperty("value")
   public Long getId() { return id; }

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

5
हां, मैंने कोशिश की थी, लेकिन मैं कर रहा था @JsonProperty(value="label")और यह काम नहीं कर रहा था, मैंने इसे कोशिश की है जैसा कि आपने सुझाव दिया है और यह काम करता है! धन्यवाद आदमी यह वास्तव में अब कोड को सरल बनाने में मदद करेगा।
अली

मेरी भी ऐसी ही आवश्यकता है। बस इतना है कि मैं जैक्सन के साथ RESTEasy का उपयोग कर रहा हूं और यह काम नहीं करता है: - / अजीब!
निक्स

सत्यापित करें कि जैक्सन वास्तव में कॉन्फ़िगर किया गया प्रदाता है और कुछ और नहीं
henrik_lundgren

2
जैक्सन (या GSON) का लाभ उठाने का एक तरीका है कि पहले से मौजूद JSON स्ट्रिंग (क्रमांकन के दौरान नहीं) में एक संपत्ति का नाम बदला जाए?
डॉन चीडल

मैंने ऑब्जेक्ट @JsonProperty ("ऑब्जेक्ट") वैल jsonObject का उपयोग किया है: स्ट्रिंग, ... लेकिन असफल रहा
राजू yourPepe

45

ज्ञात हो कि org.codehaus.jackson.annotate.JsonPropertyजैक्सन में 1.x और com.fasterxml.jackson.annotation.JsonPropertyजैक्सन में 2.x है। जाँच करें कि आप किस ObjectMapper (किस संस्करण से) का उपयोग कर रहे हैं, और सुनिश्चित करें कि आप उचित एनोटेशन का उपयोग करते हैं।


एक org.json4s.jacksonनाम स्थान भी है । :) और संभवतः jacksonYMMV के अन्य कार्यान्वयन ।
जेसी चिशोल्म

14

फ़ील्ड का नाम बदलने के लिए एक और विकल्प है:

जैक्सन मिक्सी

उपयोगी है अगर आप तीसरे पक्ष की कक्षाओं से निपटते हैं, जो आप एनोटेट करने में सक्षम नहीं हैं , या आप केवल जैक्सन विशिष्ट एनोटेशन के साथ वर्ग को प्रदूषित नहीं करना चाहते हैं।

मिक्सिन्स के लिए जैक्सन प्रलेखन पुराना है, इसलिए यह उदाहरण अधिक स्पष्टता प्रदान कर सकता है। संक्षेप में: आप मिक्सिन वर्ग बनाते हैं जो आपके इच्छित तरीके से क्रमांकन करता है। फिर उसे ObjectMapper में पंजीकृत करें:

objectMapper.addMixIn(ThirdParty.class, MyMixIn.class);

मैं उत्सुक हूं कि यह प्रदर्शन को प्रभावित करेगा जब धारावाहिकों / deserializing फ़ील्ड्स?
चान्पल

2

जैक्सन

यदि आप जैक्सन का उपयोग कर रहे हैं, तो आप @JsonPropertyदिए गए JSON संपत्ति के नाम को अनुकूलित करने के लिए एनोटेशन का उपयोग कर सकते हैं।

इसलिए, आपको @JsonPropertyएनोटेशन के साथ इकाई क्षेत्रों को एनोटेट करना होगा और इस तरह एक कस्टम JSON प्रॉपर्टी नाम प्रदान करना होगा:

@Entity
public class City {

   @Id
   @JsonProperty("value")
   private Long id;

   @JsonProperty("label")
   private String name;

   //Getters and setters omitted for brevity
}

JavaEE या जकार्ताई JSON-B

JSON-B जावा वस्तुओं को JSON से और उसके लिए परिवर्तित करने के लिए मानक बाध्यकारी परत है। यदि आप JSON-B का उपयोग कर रहे हैं, तो आप @JsonbPropertyएनोटेशन के माध्यम से JSON संपत्ति के नाम को ओवरराइड कर सकते हैं :

@Entity
public class City {

   @Id
   @JsonbProperty("value")
   private Long id;

   @JsonbProperty("label")
   private String name;

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