JSON के लिए गो संरचना को परिवर्तित करना


181

मैं jsonपैकेज का उपयोग करके एक गो संरचना को JSON में बदलने की कोशिश कर रहा हूं, लेकिन मुझे जो भी मिल रहा है {}। मुझे यकीन है कि यह पूरी तरह से स्पष्ट है लेकिन मैं इसे नहीं देखता।

package main

import (
    "fmt"
    "encoding/json"
)

type User struct {
    name string
}

func main() {
    user := &User{name:"Frank"}
    b, err := json.Marshal(user)
    if err != nil {
        fmt.Printf("Error: %s", err)
        return;
    }
    fmt.Println(string(b))
}

फिर जब मैं इसे चलाने की कोशिश करता हूं तो मुझे यह मिलता है:

$ 6g test.go && 6l -o test test.6 && ./test 
{}

जवाबों:


331

आप की जरूरत है निर्यातUser.name ताकि क्षेत्र jsonपैकेज इसे देख सकते हैं। nameक्षेत्र का नाम बदलें Name

package main

import (
    "fmt"
    "encoding/json"
)

type User struct {
    Name string
}

func main() {
    user := &User{Name: "Frank"}
    b, err := json.Marshal(user)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(b))
}

आउटपुट:

{"Name":"Frank"}

87
ध्यान दें कि आप `json:"name"`आउटपुट नाम को संरक्षित करने के लिए संरचना क्षेत्र की परिभाषा के अंत में जोड़ सकते हैं ।
डस्टिन

12
समझा। मुझे भाषा पसंद है लेकिन मुझे लगता है कि कुछ वाक्यात्मक तत्व दूर तक जाते हैं। यदि एक संरचनात्मक सदस्य का नाम व्यवहार को निर्धारित करता है तो यह गलत है।
मेजिकेयर

1
ठीक है, नाम निर्धारित करने से व्यवहार पर बहस की जा सकती है यदि यह अच्छा है या बुरा :) लेकिन यह सुनिश्चित करना आसान है कि किसी क्षेत्र को निर्यात किया गया है या नहीं और कहीं और जांचे बिना।
ओलोफ

6
@magiconair: पहले रनवे का पूंजीकरण दृश्यता निर्धारित करता है, "एक संरचनात्मक सदस्य का नाम व्यवहार को निर्धारित करता है" की तुलना में बहुत अधिक उचित विचार है । दृश्यता मेटाडेटा को कहीं संग्रहीत करने की आवश्यकता है और इसे व्यक्त करने के लिए सिंटैक्स की आवश्यकता है। आखिरकार यह निर्धारित किया गया कि सबसे पहले सबसे बड़े काम का पूंजीकरण कम से कम व्यापार-बंद के साथ सबसे अच्छा काम करता है। Go1 रिलीज़ से पहले अन्य योजनाओं की कोशिश की गई और उन्हें खारिज कर दिया गया।
deft_code

11
मैं बहुत पहले से पूंजीकरण द्वारा निर्यात सहित भाषा को पसंद कर रहा हूं।
मेजिकोनियर

62

संबंधित समस्या:

मुझे JSON के लिए संरचना को परिवर्तित करने में समस्या हो रही थी, इसे गोलंग से प्रतिक्रिया के रूप में भेज रहा था, फिर, बाद में अजाक्स के माध्यम से जावास्क्रिप्ट में समान पकड़ा।

बहुत समय बर्बाद किया, इसलिए यहां समाधान पोस्ट करना।

गो में:

// web server

type Foo struct {
    Number int    `json:"number"`
    Title  string `json:"title"`
}

foo_marshalled, err := json.Marshal(Foo{Number: 1, Title: "test"})
fmt.Fprint(w, string(foo_marshalled)) // write response to ResponseWriter (w)

जावास्क्रिप्ट में:

// web call & receive in "data", thru Ajax/ other

var Foo = JSON.parse(data);
console.log("number: " + Foo.number);
console.log("title: " + Foo.title);

आशा है कि यह किसी की मदद करता है।
शुभकामनाएँ।


6

संरचना मान JSON ऑब्जेक्ट के रूप में सांकेतिक शब्दों में बदलना। प्रत्येक निर्यातित ढांचा क्षेत्र वस्तु का सदस्य बन जाता है जब तक कि:

  • फ़ील्ड का टैग "-" है, या है
  • फ़ील्ड खाली है और इसका टैग "omitempty" विकल्प को निर्दिष्ट करता है।

खाली मान गलत, 0, किसी भी nil सूचक या इंटरफ़ेस मान, और किसी भी सरणी, टुकड़ा, नक्शा, या लंबाई शून्य का स्ट्रिंग हैं। ऑब्जेक्ट की डिफ़ॉल्ट कुंजी स्ट्रिंग संरचना क्षेत्र का नाम है लेकिन इसे संरचना क्षेत्र के टैग मान में निर्दिष्ट किया जा सकता है। संरचना क्षेत्र के टैग मान में "json" कुंजी एक प्रमुख नाम है, इसके बाद एक वैकल्पिक अल्पविराम और विकल्प हैं।


2

आप अपने स्वयं के कस्टम मार्शल मार्शल और अनमरशालजोन विधियों को परिभाषित कर सकते हैं और जानबूझकर नियंत्रित कर सकते हैं कि क्या शामिल होना चाहिए, पूर्व:

package main

import (
    "fmt"
    "encoding/json"
)

type User struct {
    name string
}

func (u *User) MarshalJSON() ([]byte, error) {
    return json.Marshal(&struct {
        Name     string `json:"name"`
    }{
        Name:     "customized" + u.name,
    })
}

func main() {
    user := &User{name: "Frank"}
    b, err := json.Marshal(user)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(b))
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.