गो

2015-05-25 8 views
11

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

type Test struct { 
    A string 
    B string 
    C string 
} 

ए, बी, और सी के लिए डिफ़ॉल्ट मान, कर रहे हैं "एक", "बी", और "सी" क्रमश: उदाहरण के लिए, मैं struct प्रकार है। इसका मतलब यह है कि जब मैं json पार्स:

{"A": "1", "C": 3} 

मैं struct प्राप्त करना चाहते हैं:

Test{A: "1", B: "b", C: "3"} 

में निर्मित पैकेज encoding/json का उपयोग करना संभव है? अन्यथा, क्या कोई गो लाइब्रेरी है जिसमें यह कार्यक्षमता है?

उत्तर

37

यह एन्कोडिंग/जेसन का उपयोग करना संभव है: json.Unmarshal पर कॉल करते समय, आपको इसे एक खाली संरचना देने की आवश्यकता नहीं है, आप इसे डिफ़ॉल्ट मानों के साथ दे सकते हैं।

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

var example []byte = []byte(`{"A": "1", "C": "3"}`) 

out := Test{ 
    A: "default a", 
    B: "default b", 
    // default for C will be "", the empty value for a string 
} 
err := json.Unmarshal(example, &out) // <-- 
if err != nil { 
    panic(err) 
} 
fmt.Printf("%+v", out) 

this example in the Go playground रिटर्न {A:1 B:default b C:3} चल रहा है।

जैसा कि आप देख सकते हैं, json.Unmarshal(example, &out) जेएसओएन में निर्दिष्ट मानों को ओवरराइट करते हुए JSON को out में अनमर्शल करता है, लेकिन अन्य फ़ील्ड अपरिवर्तित छोड़ देता है।

3
मामले में यू Test structs स्वीकार किए जाते हैं जवाब संभव नहीं है की एक सूची या नक्शे अब और है

लेकिन यह आसानी से एक UnmarshalJSON विधि के साथ बढ़ाया जा सकता है:

func (t *Test) UnmarshalJSON(data []byte) error { 
    type testAlias Test 
    test := &testAlias{ 
    B: "default B", 
    } 

    _ = json.Unmarshal(data, test) 

    *t = Test(*test) 
    return nil 
} 

testAlias ​​UnmarshalJSON को पुनरावर्ती कॉल को रोकने के लिए की जरूरत है । यह काम करता है क्योंकि एक नए प्रकार में कोई विधि परिभाषित नहीं है।

https://play.golang.org/p/qiGyjRbNHg