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 = "[email protected]"

    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?

Doug Knesek
fuente

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

Muffin Top
fuente
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
 }
Sourabh Bhagat
fuente
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

superup
fuente
1
agregar más detalles
Basil
Yapp, agrego más detalles.
Superup