2014-10-12 8 views
57
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 json.Marshal (struct) gibt "{}"

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

Warum ist die JSON im Wesentlichen leer?

Antwort

112

Sie müssen export die Felder in TestObject durch Großschreibung des ersten Buchstabens im Feldnamen. Ändern Sie kind zu Kind und 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 Zeichenfolgen , die den Felddeklarationen folgen, sind struct tags. Die Tags in dieser Struktur legen die Namen der Felder der Struktur beim Marshalling von und nach JSON fest.

playground

+0

es soll unter der Antwort unter keinen „Raum“ vor „omitempty“ – Damon

+0

Aber zu beachten ist; Dies geschieht automatisch, wenn der erste Buchstabe des Strukturfeldes großgeschrieben wird. –

18
  • Wenn der erste Brief ist aktiviert, die Kennung zu jedem Stück Code öffentlich ist, die Sie verwenden möchten.
  • Wenn der erste Buchstabe Klein ist, ist die Kennung privater und konnte nur im Paket zugegriffen wird es erklärt wurde.

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 
} 
+1

genialer Mann, Arbeit perfekt ändern nur den ersten Brief an den oberen Fall, vielen Dank – vuhung3990

+1

Genau, 'In Go, wird ein Name exportiert, wenn es mit einem Großbuchstaben beginnt. Um es in Zusammenhang zu bringen, besuchen Sie diese [Go Basics Tour] (https://tour.golang.org/basics/3) – Mohsin