2013-03-16 1 views
14

Używam Go 1.0.3 na Mac OS X 10.8.2 i eksperymentuję z pakietem json, próbując przekazać strukturę do JSON, ale wciąż otrzymuję pustą {} json obiekt.Moje struktury nie układają się w jsonie

Wartość jest zerowa, więc nic nie jest nie tak zgodnie z funkcją json.Marshal, a struktura jest poprawna. Dlaczego to się dzieje?

package main 

import (
    "encoding/json" 
    "fmt" 
) 

type Address struct { 
    street string 
    extended string 
    city string 
    state string 
    zip string 
} 

type Name struct { 
    first string 
    middle string 
    last string 
} 

type Person struct { 
    name Name 
    age int 
    address Address 
    phone string 
} 

func main() { 
    myname := Name{"Alfred", "H", "Eigenface"} 
    myaddr := Address{"42 Place Rd", "Unit 2i", "Placeton", "ST", "00921"} 
    me := Person{myname, 24, myaddr, "000 555-0001"} 

    b, err := json.Marshal(me) 

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

    fmt.Println(string(b)) // err is nil, but b is empty, why? 
    fmt.Println("\n") 
    fmt.Println(me)   // me is as expected, full of data 
} 

Odpowiedz

33

Musisz ustawić pola, które chcesz publicznie przekazać. Jak to:

type Address struct { 
    Street string 
    Extended string 
    City string 
    State string 
    Zip string 
} 

err jest nil ponieważ wszystkie eksportowane pola, w tym przypadku nie ma żadnego, były przetaczane poprawnie.

przykład robocza: http://play.golang.org/p/0Q8TIvZwuj

Sprawdź docs http://godoc.org/encoding/json/#Marshal

+1

Że to było, przeszedłem przez linię "Każde pole _exported_ struct". Dziękuję Ci. – tlehman

+0

dziękuję za wskazanie "publicznego". –

4

pamiętać, że można również manipulować, co nazwa pól w wygenerowanym JSON są wykonując następujące czynności:

type Name struct { 
    First string `json:"firstname"` 
    Middle string `json:"middlename"` 
    Last string `json:"lastname"` 
} 
+0

Podoba mi się ten sposób kojarzenia struktur i obiektów json. – tlehman