/ / अनारशाल जेनरिक जोंस इन गो - जसन, जेनेरिक, गो

Unmarshal जेनेरिक जेसन में जाओ - जेसन, जेनेरिक, जाओ

मैं एक नया गो प्रोग्रामर हूं (जावा से) और मैं एक सामान्य तरीके से पुन: पेश करना चाहूंगा जो जावा में उपयोग करने के लिए है।

मैं कुछ फ़ंक्शन बनाना चाहता हूं जो मुझे कोड डुप्लिकेट से बचने के लिए JSON स्ट्रिंग पर एक अनमरशाल करने की अनुमति देता है।

यह मेरा वर्तमान कोड है जो काम नहीं कर रहा है:

type myStruct1 struct {
id string
name string
}

func (obj myStruct1) toString() string {
var result bytes.Buffer
result.WriteString("id : ")
result.WriteString(obj.id)
result.WriteString("n")
result.WriteString("name : ")
result.WriteString(obj.name)

return result.String()
}

func main() {

content := `{id:"id1",name="myName"}`
object := myStruct1{}
parseJSON(content, object)

fmt.Println(object.toString())
}

func parseJSON(content string, object interface{}) {
var parsed interface{}
json.Unmarshal([]byte(content), &parsed)
}

यह कोड, रन पर, मुझे यह लौटाता है:

id :
name :

क्या तुम्हारे पास कोई विचार है ?

धन्यवाद

उत्तर:

जवाब के लिए 2 № 1

मुद्दा यह है कि क्या आप सामान्य प्रकार से लिखना चाहते हैं? आप शायद एक स्ट्रिंग नक्शा चाहते हैं। यह BSON वैसे भी काम करता है:

var anyJson map[string]interface{}
json.Unmarshal(bytes, &anyJson)

आप "फ़ील्ड को इस तरह एक्सेस करने में सक्षम होंगे:

anyJson["id"].(string)

डॉन "अपने मूल्यों को मुखर करने के लिए भूल जाते हैं, और वे जरूर सही प्रकार हो या वे "घबराएँगे। (आप गोलंग साइट पर टाइप के बारे में अधिक पढ़ सकते हैं)"


जवाब के लिए 0 № 2

आपको अपने क्षेत्र निर्यात करने होंगे:

type myStruct1 struct {
Id string
Name string
}

देख निर्यात किए गए पहचानकर्ता प्रलेखन से।


जवाब के लिए 0 № 3

आपके कोड को काम करने के लिए इसमें कुछ बदलाव करने होंगे:

  1. कार्यक्रम json.Unmarshal केवल आपकी संरचना के अंदर चर सेट कर सकते हैं जो निर्यात किए जाते हैं, जो कि बड़े अक्षरों से शुरू होता है। जैसे कुछ का उपयोग करें ID तथा Name अंदर अपने चर नामों के लिए myStruct1.
  2. आपकी सामग्री अमान्य JSON है। आप वास्तव में क्या चाहते हैं {"ID":"id1","Name":"myName"}.
  3. आप "गुजर रहे हैं object सेवा मेरे parseJSON लेकिन आप "का उपयोग कर रहे हैं parsed इसके बजाय, नहीं object। बनाना parseJSON एक मिला *myStruct (के बजाय ए interface{}), और इसके बजाय उस चर का उपयोग करें parsed जब स्ट्रिंग unmarshalling। इसके अलावा, हमेशा त्रुटि रिटर्न को संभालें, जैसे err := json.Unmarshal(content, object), और जाँच करें err.

मैं आपको ऐसा करने का सुझाव देता हूं गोलंग टूर ;)


जवाब के लिए 0 № 4

अनमरशाल केवल संरचना के निर्यात क्षेत्रों को निर्धारित करेगा।

इसका मतलब है कि आपको कैपिटल केस लेटर्स का उपयोग करने के लिए json स्ट्रक्चर को संशोधित करना होगा:

type myStruct1 struct {
Id string
Name string
}

इसके पीछे कारण यह है कि जब तक वे निर्यात नहीं किए जाते हैं, तब तक json लाइब्रेरी में रिफ्लेक्ट का उपयोग करके फ़ील्ड्स देखने की क्षमता नहीं होती है।