json.Marshal (struct) devuelve "{}"


128
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á la salida:

[ `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?

Respuestas:


233

Que necesita para exportar los campos en TestObject mediante la capitalización de la primera letra del nombre del campo. Cambiar kinda Kindy 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 codificación / json y paquetes similares ignoran los campos no exportados.

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

playground


se supone que no hay "espacio" antes de "omitempty"
Damon

¿Puedo hacer con letra minúscula?
user123456

Si desea una pequeña letra, etiquete los campos stackoverflow.com/questions/21825322/…
user123456

1
@ user123456 Establezca el nombre del campo JSON en un nombre en minúsculas utilizando la jsonetiqueta del campo (como se describe en el último párrafo de esta respuesta).
Muffin Top

28
  • Cuando se escribe con mayúscula la primera letra , el identificador es público para cualquier fragmento de código que desee utilizar.
  • Cuando la primera letra es 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
 }

3
hombre maravilloso, trabajo perfecto, solo cambia la primera letra a MAYÚSCULAS, muchas gracias
vuhung3990

2
Exactamente, In Go, a name is exported if it begins with a capital letter. Para ponerlo en contexto, visite este recorrido básico de Go
Mohsin

3

En golang

en la estructura, la primera letra debe ser mayúscula ej. número de teléfono -> número de teléfono

======= Añadir detalles

Primero, trato de codificar así

type Questions struct {
    id           string
    questionDesc string
    questionID   string
    ans          string
    choices      struct {
        choice1 string
        choice2 string
        choice3 string
        choice4 string
    }
}

La compilación de Golang no es un error y no muestra advertencia. Pero la respuesta está vacía porque algo

Después de eso, busqué en Google encontré este artículo

Los tipos de estructura y los literales de tipo de estructura Artículo entonces ... Intento editar código.

//Questions map field name like database
type Questions struct {
    ID           string
    QuestionDesc string
    QuestionID   string
    Ans          string
    Choices      struct {
        Choice1 string
        Choice2 string
        Choice3 string
        Choice4 string
    }
}

Es trabajo.

Espero ayuda


1
agregar más detalles
Basil

Yapp, agrego más detalles.
Superup
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.