json.Marshal (संरचना) रिटर्न "{}"


128
type TestObject struct {
    kind string `json:"kind"`
    id   string `json:"id, omitempty"`
    name  string `json:"name"`
    email string `json:"email"`
}

func TestCreateSingleItemResponse(t *testing.T) {
    testObject := new(TestObject)
    testObject.kind = "TestObject"
    testObject.id = "f73h5jf8"
    testObject.name = "Yuri Gagarin"
    testObject.email = "Yuri.Gagarin@Vostok.com"

    fmt.Println(testObject)

    b, err := json.Marshal(testObject)

    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(string(b[:]))
}

यहाँ उत्पादन है:

[ `go test -test.run="^TestCreateSingleItemResponse$"` | done: 2.195666095s ]
    {TestObject f73h5jf8 Yuri Gagarin Yuri.Gagarin@Vostok.com}
    {}
    PASS

JSON अनिवार्य रूप से खाली क्यों है?

जवाबों:


233

आप की जरूरत है निर्यात क्षेत्र नाम के पहले अक्षर को बड़े अक्षरों में से TestObject में खेतों। बदलें kindकरने के लिए Kindऔर इतने पर।

type TestObject struct {
 Kind string `json:"kind"`
 Id   string `json:"id,omitempty"`
 Name  string `json:"name"`
 Email string `json:"email"`
}

एन्कोडिंग / json पैकेज और समान पैकेज अनएक्सपोर्ट किए गए फ़ील्ड को अनदेखा करते हैं।

`json:"..."`तार कि क्षेत्र घोषणाओं का पालन कर रहे हैं struct टैग । इस संरचना के टैग्स ने JSON के और से मार्शलिंग करते समय संरचना के क्षेत्रों के नाम निर्धारित किए हैं।

playground


"ओमिटेमेट्टी" से पहले "स्पेस" नहीं माना जाता है
डेमन

क्या मैं छोटे अक्षर से बना सकता हूं?
user123456

यदि आप छोटे अक्षर टैग करना चाहते हैं तो फ़ील्ड stackoverflow.com/questions/21825322/…
user123456

1
@ user123456 JSON फ़ील्ड नाम का उपयोग करके लोअरकेस नाम पर सेट करें json फील्ड टैग (जैसा कि इस उत्तर के अंतिम पैराग्राफ में वर्णित है)।
मफिन टॉप

28
  • जब पहला अक्षर पूंजीकृत होता है , तो पहचानकर्ता किसी भी कोड के टुकड़े के लिए सार्वजनिक होता है जिसे आप उपयोग करना चाहते हैं।
  • जब पहले अक्षर है लोअरकेस , पहचानकर्ता निजी है और केवल पैकेज यह घोषित किया गया था से पहुंचा जा सकता है।

उदाहरण

 var aName // private

 var BigBro // public (exported)

 var 123abc // illegal

 func (p *Person) SetEmail(email string) {  // public because SetEmail() function starts with upper case
    p.email = email
 }

 func (p Person) email() string { // private because email() function starts with lower case
    return p.email
 }

3
कमाल का आदमी, सही काम केवल पहले पत्र को UPPER CASE में बदल दें, बहुत बहुत धन्यवाद
vuhung3990

2
वास्तव में, In Go, a name is exported if it begins with a capital letter। इसे संदर्भ में रखने के लिए, इस गो बेसिक्स टूर
मोहसिन

3

गोलंग में

संरचना में पहले अक्षर को पूर्व अपरकेस होना चाहिए। फोननंबर -> फोननंबर

======= विवरण जोड़ें

सबसे पहले, मैं इस तरह कोडिंग की कोशिश कर रहा हूँ

type Questions struct {
    id           string
    questionDesc string
    questionID   string
    ans          string
    choices      struct {
        choice1 string
        choice2 string
        choice3 string
        choice4 string
    }
}

गोलंग संकलन त्रुटि नहीं है और चेतावनी नहीं दिखाता है। लेकिन प्रतिक्रिया खाली है क्योंकि कुछ है

उसके बाद, मुझे लगता है कि यह लेख मिला

संरचना के प्रकार और संरचना के प्रकार लेख तो ... मैं कोड एडिट करने की कोशिश करता हूं।

//Questions map field name like database
type Questions struct {
    ID           string
    QuestionDesc string
    QuestionID   string
    Ans          string
    Choices      struct {
        Choice1 string
        Choice2 string
        Choice3 string
        Choice4 string
    }
}

काम है।

मदद की उम्मीद है।


1
अधिक जानकारी जोड़ें
तुलसी

हां, मैं और अधिक विवरण जोड़ता हूं।
सुपरअप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.