लोअरकेस JSON गोल्स में JSON मार्शल के साथ प्रमुख नाम


175

मैं "encoding/json"पैकेज का उपयोग अपने आवेदन के आयातित पैकेजों में से एक में घोषित एक संरचना के लिए करना चाहता हूं।

उदाहरण के लिए .:

type T struct {
    Foo int
}

क्योंकि यह आयात किया गया है, संरचना में सभी उपलब्ध (निर्यात) फ़ील्ड ऊपरी मामले पत्र के साथ शुरू होते हैं। लेकिन मैं चाहता हूँ कि मामले में नाम कम हों:

out, err := json.Marshal(&T{Foo: 42})

में परिणाम होगा

{ "फू": 42}

लेकिन मैं पाना चाहता हूं

{ "Foo": 42}

क्या कुछ आसान तरीके से समस्या का समाधान संभव है?


5
@Zippoxer: मैं कहूंगा: एक क्लाइंट / सर्वर संचार प्रोटोकॉल में एक कुंजी जो निचले मामलों के पत्रों को कड़ाई से परिभाषित करती है। खैर, मेरे मामले में इससे कोई फर्क नहीं पड़ता क्योंकि मैंने खुद को प्रोटोकॉल परिभाषित किया है .. लेकिन सिद्धांत रूप में कम से कम? लेकिन, मुझे पता है कि यह मुख्य रूप से सिर्फ एक मूर्खतापूर्ण थोड़ा विस्तार पर बहुत अधिक समय खर्च कर रहा है।
ANisus

माफी न मांगें। आप मूर्खतापूर्ण एक नहीं हैं, जो भाषा पूरी तरह से स्वीकार नहीं करती है वह मूर्खतापूर्ण है (हालांकि समस्या आसानी से हल हो गई है, नीचे के रूप में)।
जहान

@ANisus: मैंने आपके प्रश्न को स्ट्रक्चरल नामों के बारे में बताया है, JSON कुंजी नामों के बारे में नहीं। वोट वापस ले लिया।
टिमटिमा

जवाबों:


265

एन्कोडिंग / json.Marshal के लिए डॉक्स पर एक नजर है । यह निर्धारित करने के लिए कि किस तरह से तैयार किए गए जोंस को स्वरूपित किया जाता है, यह निर्धारित करने के लिए संरचनात्मक क्षेत्र टैग का उपयोग करने पर चर्चा करता है।

उदाहरण के लिए:

type T struct {
    FieldA int    `json:"field_a"`
    FieldB string `json:"field_b,omitempty"`
}

यह JSON इस प्रकार उत्पन्न करेगा:

{
    "field_a": 1234,
    "field_b": "foobar"
}

8
फ़ील्ड टैग? ओह मेरी .. डॉक्स में खोज करने पर मुझे यह पूरा हिस्सा याद आ गया। मैं झंडे, कार्यों या कुछ अन्य सेटिंग्स की तलाश कर रहा था। खैर, यह सटीक उत्तर है जिसकी मुझे तलाश थी! और इसके अलावा, मेरे पास सीखने के लिए एक नया गो कॉन्सेप्ट है: फील्ड टैग :)
एनिसस

वे काफी काम के हैं। आप उन्हें reflectपैकेज के माध्यम से रनटाइम पर एक्सेस कर सकते हैं ।
जमैत 27'12

हाँ, जब मैं प्रतिबिंब के साथ काम कर रहा हूँ, तो देखता हूँ कि मेटा डेटा को एक क्षेत्र में जोड़ने का एक तरीका कैसे अद्भुत हो सकता है! Btw, बस जवाब की कोशिश की। एक जादू की तरह काम करता है।
एनिसस

5
मैंने अभी-अभी गो भाषा को शाप देना शुरू किया है - यह कितनी बेवकूफी है, वे उत्पन्न JSON आदि में लोअरकेस अक्षरों के साथ फ़ील्ड क्यों बनाएंगे, आदि तब मैंने इस थ्रेड में आया और सोचा कि "ओएमजी शानदार है !!!"। मैं भी कूद गया और अपनी प्रेमिका को समझाया कि मैं इतना उत्साहित क्यों हूं: D यह बहुत अच्छा है :)))
nyxz

11
सुनिश्चित करें कि कोलन और टैग के पहले उद्धरण चिह्न के बीच कोई स्थान नहीं है! के json:"some_tag"बजाय का उपयोग करें json: "some_tag"। मैं थोड़ी देर के लिए इस से मिला।
डेविड मोराल्स

8

आप उन कुंजियों के साथ अपनी खुद की संरचना बना सकते हैं जिन्हें आप निर्यात करना चाहते हैं, और उन्हें लोअरकेस नामों के लिए उपयुक्त जौन टैग दें। फिर आप JSON के रूप में एन्कोडिंग से पहले वांछित संरचना को आप में कॉपी कर सकते हैं। या यदि आप एक स्थानीय संरचना बनाने के साथ परेशान नहीं करना चाहते हैं तो आप संभवतः एक map[string]interface{}और सांकेतिक शब्दों में बदलना कर सकते हैं।


मूर्खतापूर्ण बात यह है कि अन्य पैकेज (प्रकार युक्त) वास्तव में मेरा भी है। लेकिन, हां, मैंने शायद इस तथ्य पर आंखें मूंद ली हैं कि यह एक ढांचा होना चाहिए। का उपयोग करते हुए एक map[string]interface{}लंबे समय के रूप में काम करेगा मैं नेस्टेड वस्तुओं / structs के साथ अंत नहीं है
ANisus

1
@ANisus: ओह, मेरा जवाब आप की संरचना की परिभाषा के नियंत्रण में नहीं होने पर पूर्वनिर्धारित था। jimt का जवाब निश्चित रूप से आप क्या चाहते हैं।
लिली बैलार्ड

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