json.Marshal (struct) gibt "{}" zurück

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 = "[email protected]"

    fmt.Println(testObject)

    b, err := json.Marshal(testObject)

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

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

Hier ist die Ausgabe:

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

Warum ist der JSON im Wesentlichen leer?

Doug Knesek
quelle

Antworten:

233

Sie müssen exportieren die Felder in Testobject durch Nutzung der ersten Buchstaben in dem Feldnamen. Wechseln Sie kindzu Kindund so weiter.

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

Das encoding / json-Paket und ähnliche Pakete ignorieren nicht exportierte Felder.

Die `json:"..."`Zeichenfolgen, die den Felddeklarationen folgen, sind Struktur-Tags . Die Tags in dieser Struktur legen die Namen der Felder der Struktur beim Marshalling von und nach JSON fest.

playground

Muffin Top
quelle
Es soll kein "Leerzeichen" vor "Auslassen" geben
Damon
Kann ich mit kleinem Brief machen?
user123456
Wenn Sie kleine Buchstaben Tag möchten, die Felder stackoverflow.com/questions/21825322/…
user123456
1
@ user123456 Setzen Sie den JSON-Feldnamen mithilfe des jsonFeld-Tags auf einen Kleinbuchstaben (wie im letzten Absatz dieser Antwort beschrieben).
Muffin Top
28
  • Wenn der erste Buchstabe groß geschrieben wird , ist die Kennung für jeden Code öffentlich, den Sie verwenden möchten.
  • Wenn der erste Buchstabe in Kleinbuchstaben geschrieben ist , ist die Kennung privat und kann nur innerhalb des deklarierten Pakets aufgerufen werden.

Beispiele

 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
 }
Sourabh Bhagat
quelle
3
Super Mann, arbeite perfekt, ändere nur den ersten Buchstaben in UPPER CASE, vielen Dank
vuhung3990
2
Genau In Go, a name is exported if it begins with a capital letter. Um es in einen Zusammenhang zu bringen, besuchen Sie diese Go Basics Tour
Mohsin
3

In Golang

in struct muss der erste Buchstabe z. Telefonnummer -> Telefonnummer

======= Details hinzufügen

Zuerst versuche ich so zu codieren

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

golang compile ist kein Fehler und zeigt keine Warnung an. Aber die Antwort ist leer, weil etwas

Danach suche ich bei Google diesen Artikel gefunden

Strukturtypen und Strukturtypliterale Artikel dann ... Ich versuche, Code zu bearbeiten.

//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
    }
}

Ist Arbeit.

Hoffe auf Hilfe.

Superup
quelle
1
Weitere Details hinzufügen
Basil
Yapp, ich füge weitere Details hinzu.
Superup