json.Marshal (struct) devuelve “{}”

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 = "Yuri.Gagarin@Vostok.com" fmt.Println(testObject) b, err := json.Marshal(testObject) if err != nil { fmt.Println(err) } fmt.Println(string(b[:])) } 

Aquí está el resultado:

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

¿Por qué el JSON está esencialmente vacío?

Debe exportar los campos en TestObject al escribir en mayúscula la primera letra del nombre del campo. Cambia kind to Kind y así sucesivamente.

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

El paquete de encoding / json y paquetes similares ignoran los campos no exportados.

Las cadenas `json:"..."` que siguen a las declaraciones de campo son tags struct . Las tags en esta estructura establecen los nombres de los campos de la estructura cuando se calculan para y desde JSON.

patio de recreo

  • Cuando la primera letra está en mayúscula , el identificador es público para cualquier parte de código que desee utilizar.
  • Cuando la primera letra está en minúscula , el identificador es privado y solo se puede acceder dentro del paquete que se declaró.

Ejemplos

  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 }