web-dev-qa-db-fra.com

json.Marshal (struct) renvoie "{}"

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[:]))
}

Voici la sortie:

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

Pourquoi le JSON est-il essentiellement vide?

106
Doug Knesek

Vous devez exporter les champs de TestObject en majuscule la première lettre du nom du champ. Remplacez kind par Kind et ainsi de suite.

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

Le package encoding/json et les packages similaires ignorent les champs non exportés.

Le `json:"..."` Les chaînes qui suivent les déclarations de champ sont balises struct . Les balises de cette structure définissent les noms des champs de la structure lors du marshaling vers et depuis JSON.

playground

191
Cerise Limón
  • Lorsque la première lettre est en majuscule , l'identificateur est public pour tout élément de code que vous souhaitez utiliser.
  • Lorsque la première lettre est en minuscule , l'identifiant est privé et n'est accessible que dans le package pour lequel il a été déclaré.

Exemples

 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
 }
25
Sourabh Bhagat