कन्वर्ट JSON शैली के गुणों के नाम के साथ Java CamelCase नाम GSON


106

मैं JSON डेटा को जावा ऑब्जेक्ट में बदलने के लिए GSON का उपयोग कर रहा हूं । यह मेरे सभी परीक्षणों में बहुत अच्छा काम करता है। समस्या यह है कि हमारी वास्तविक वस्तुओं में is_online जैसे कुछ गुण हैं। जीएसओएन केवल उन्हें मैप करता है यदि उन्हें पूरी तरह से समान नाम दिया गया है, तो अच्छा होगा कि जीएसओएन को नामों को जावा कैमल केस इसऑनलाइन में बदल दिया जाए।

ऐसा लगता है कि JSON डेटा बनाते समय यह संभव है, ऊंट मामले को JSON में अलग किए गए अंडरस्कोर शब्दों में बदल दिया जाता है। लेकिन मैं इसे दूसरे तरीके से निर्दिष्ट करने का तरीका नहीं खोज सकता।


5
मैं एक उत्तर स्वीकार करने का प्रस्ताव करूंगा
जीनवल्जेन

जवाबों:


313

मैंने पाया है कि निम्नलिखित सेटिंग सही काम करती है जब अंडरसीटेड विशेषताओं के साथ जोंस पढ़ना और मेरे मॉडल में कैमलकास्टिंग का उपयोग करना।

Gson gson = new GsonBuilder()
    .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
    .create()

2
शानदार जवाब, धन्यवाद! @janusz, यदि इनमें से किसी भी उत्तर ने आपकी मदद की, तो कृपया उन्हें स्वीकृत उत्तर के रूप में चिह्नित करें।
सूफिनवाज़

1
यदि आपके पास एक मामला है जहां नाम में दो अंडरस्कोर हैं, तो यह पहले अंडरस्कोर को अनदेखा करता है। पूर्व। यह_की_हस्सा_टॉउंडर्सकोर्स में परिवर्तित हो जाएगा ।KeyHas_TwoUnderscores और उसी के विपरीत। मुख्य बिंदु फ़ील्डनामिंगपोली है, जहां एनम अंडरस्कोर के साथ "लोअर केस" कहता है, जबकि यहां परिवर्तित नाम में अंडरस्कोर (_T) के साथ एक ऊपरी मामला है।
दीपक जीएम

बहुत सरल, मुझे खेतों के एक झुंड को एनोटेट करने से बचाता है!
विलियम टी। मलार्ड

98

आप SerializedNameएनोटेशन का उपयोग कर सकते हैं :

@SerializedName("field_name_in_json")
private final String fieldNameInJava;

नोट: जब आप FieldNamingPolicyपहले से ही सेट कर चुके होते हैं, SerializedNameतो उस विशिष्ट फ़ील्ड के लिए इसकी सेटिंग्स को ओवरराइट कर देगा (विशेष मामलों के लिए काफी आसान)।


2

आपके उदाहरण में भालू एक किनारे का मामला है। यदि आपके पास एक संपत्ति 'फू' है, तो इसके गेटटर का नाम 'getFoo' होना चाहिए, और यदि आपके पास 'foo_bar' नाम की संपत्ति है, तो इसके गेट्टर को 'getFooBar' नाम दिया जाना चाहिए, हालाँकि, आपके उदाहरण में आप एक बूलियन और बूलियन की मैपिंग कर रहे हैं जावा में विशेष मामला नामकरण। ऑनलाइन प्राइमरी बूलियन प्रॉपर्टी के पास 'isOnline' नाम का एक गेट्टर होना चाहिए, न कि 'getOnline' या इससे भी बदतर, 'getIsOnline'। बूलियन रैपर ऑब्जेक्ट (यानी बूलियन) को इस विशेष मामले का पालन नहीं करना चाहिए और 'ऑनलाइन' नाम की संपत्ति में 'गेटऑनलाइन' नाम का एक गेट्टर होना चाहिए।

इसलिए, नाम में 'इज' के साथ बूलियन गुण होना एक किनारे का मामला है, जहां आप अपने रूपांतरण के दौरान इस विशेष उपसर्ग को बाहर निकालना चाहते हैं। उल्टी दिशा में, आपका कोड कच्चे संपत्ति के नाम के साथ-साथ 'is_XXX' संस्करण के लिए json ऑब्जेक्ट का निरीक्षण करना चाह सकता है।


2

मुझे लगता है कि आप जो चाहते हैं वह यहां है । एनोटेशन का उपयोग करके आप GSON को बता सकते हैं कि MySuperCoolField को वास्तव में JSON में इस_फ़ील्ड_इस_फुन कहा जाता है और यह इसे सही ढंग से अनपैक करेगा। कम से कम मुझे लगता है कि यह deserialization के लिए भी काम करता है।

यदि वह काम नहीं करता है, तो आप कस्टम JsonSerializer / JsonDeserializers का उपयोग कर सकते हैं, जो बहुत अच्छा काम करते हैं, लेकिन आपको उन्हें अपनी कक्षा में परिवर्तन के लिए अपडेट करना होगा (जैसे कि जब आप कोई फ़ील्ड जोड़ते हैं)। आप ऑटो-मैजिक खो देते हैं।

करने के लिए सबसे आसान काम (जो बदसूरत होगा, लेकिन बहुत साफ और सरल अगर पहला सुझाव काम नहीं करता है) बस जीएसओएन को खुश करने के लिए एक तरह से फ़ील्ड का नाम देना होगा, और आपके द्वारा पसंद किए जाने वाले नामों के साथ अतिरिक्त एक्सेसर विधियों को जोड़ना होगा। , उदा

public boolean isXXX() {return this.is_XXX;}

आसान बात यह है कि मैं इस समय क्या कर रहा हूं और यह ठीक काम करता है। सभी बदसूरत नहीं विशिष्ट जावा स्टाइल कोड डेटा कक्षाओं में छिपा हुआ है और बाहर से कोई भी इसे नहीं देखेगा। लेकिन यह अभी भी मुझे थोड़ा परेशान कर रहा है :)
Janusz
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.