Konvertieren der Go-Struktur in JSON


180

Ich versuche, eine Go-Struktur mit dem jsonPaket in JSON zu konvertieren , aber alles, was ich bekomme, ist {}. Ich bin sicher, dass es etwas völlig Offensichtliches ist, aber ich sehe es nicht.

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

Wenn ich dann versuche, es auszuführen, erhalte ich Folgendes:

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

Antworten:


327

Sie müssen das Feld exportierenUser.name , damit das jsonPaket es sehen kann. Benennen Sie das nameFeld in um 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))
}

Ausgabe:

{"Name":"Frank"}

87
Beachten Sie, dass Sie `json:"name"`am Ende der Strukturfelddefinition hinzufügen können , um den Ausgabenamen beizubehalten.
Dustin

12
Aha. Ich mag die Sprache ein bisschen, aber ich denke, einige syntaktische Elemente gehen zu weit. Wenn der Name eines Strukturelements das Verhalten bestimmt, ist dies einfach falsch.
Magiconair

1
Nun, wenn der Name das Verhalten bestimmt, kann darüber diskutiert werden, ob es gut oder schlecht ist :), aber es macht es sicher einfach zu wissen, ob ein Feld exportiert wird oder nicht, ohne irgendwo anders nachsehen zu müssen.
Olof

6
@magiconair: Die Großschreibung der ersten Rune bestimmt die Sichtbarkeit , ist eine viel vernünftigere Idee als "der Name eines Strukturelements bestimmt das Verhalten" . Die Sichtbarkeitsmetadaten müssen irgendwo gespeichert werden und benötigen eine Syntax, um sie auszudrücken. Schließlich wurde festgestellt, dass die Kooptation der Kapitalisierung des ersten Zeichens am besten mit den geringsten Kompromissen funktioniert. Vor der Veröffentlichung von Go1 wurden andere Schemata ausprobiert und abgelehnt.
Deft_code

11
Ich habe seitdem einen langen Weg zurückgelegt und mag die Sprache einschließlich des Exports durch Großschreibung jetzt sehr.
Magiconair

62

Verwandte Ausgabe:

Ich hatte Probleme, die Struktur in JSON zu konvertieren, sie als Antwort von Golang zu senden und sie später in JavaScript über Ajax abzufangen.

Viel Zeit verschwendet, also Lösung hier posten.

In Go:

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

In JavaScript:

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

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

Hoffe das hilft jemandem.
Viel Glück.


6

Strukturwerte werden als JSON-Objekte codiert. Jedes exportierte Strukturfeld wird Mitglied des Objekts, es sei denn:

  • Das Feld-Tag lautet "-" oder
  • Das Feld ist leer und sein Tag gibt die Option "Auslassen" an.

Die leeren Werte sind false, 0, ein beliebiger Nullzeiger oder Schnittstellenwert sowie ein Array, ein Slice, eine Map oder eine Zeichenfolge mit der Länge Null. Die Standardschlüsselzeichenfolge des Objekts ist der Name des Strukturfelds, kann jedoch im Tag-Wert des Strukturfelds angegeben werden. Der "json" -Schlüssel im Tag-Wert des Strukturfelds ist der Schlüsselname, gefolgt von einem optionalen Komma und Optionen.


2

Sie können Ihre eigenen benutzerdefinierten MarshalJSON- und UnmarshalJSON-Methoden definieren und absichtlich steuern, was enthalten sein soll, z.

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))
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.