json.Marshal (struct) restituisce "{}"


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

Ecco l'output:

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

Perché il JSON è essenzialmente vuoto?

Risposte:


233

È necessario esportare i campi in TestObject capitalizzando la prima lettera nel nome del campo. Passare kinda Kinde così via.

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

Il pacchetto encoding / json e pacchetti simili ignorano i campi non esportati.

Le `json:"..."`stringhe che seguono le dichiarazioni dei campi sono tag struct . I tag in questa struttura impostano i nomi dei campi della struttura durante il marshalling da e verso JSON.

playground


non dovrebbe esserci "spazio" prima di "omitempty"
Damon,

Posso fare con una piccola lettera?
user123456

Se si desidera che la lettera minuscola etichetta i campi stackoverflow.com/questions/21825322/...
user123456

1
@ user123456 Impostare il nome del campo JSON su un nome minuscolo utilizzando il jsontag del campo (come descritto nell'ultimo paragrafo di questa risposta).
Muffin Top

28
  • Quando la prima lettera è in maiuscolo , l'identificatore è pubblico per qualsiasi parte di codice che si desidera utilizzare.
  • Quando la prima lettera è minuscola , l'identificatore è privato ed è possibile accedervi solo all'interno del pacchetto in cui è stata dichiarata.

Esempi

 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
uomo fantastico, lavoro perfetto cambia solo la prima lettera in MAIUSCOLO, grazie mille
vuhung3990

2
Esattamente, In Go, a name is exported if it begins with a capital letter. Per metterlo nel contesto, visita questo Go Basics Tour
Mohsin,

3

A Golang

in struct la prima lettera deve essere maiuscola ex. numero di telefono -> Numero di telefono

======= Aggiungi dettagli

Per prima cosa, provo a scrivere codice in questo modo

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

la compilazione del Golang non è un errore e non mostra un avviso. Ma la risposta è vuota perché qualcosa

Successivamente, ho cercato su Google trovato questo articolo

Tipi struct e le struct Tipo letterali articolo allora ... provo codice di modifica.

//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
    }
}

È lavoro.

Spero in aiuto.


1
aggiungi maggiori dettagli
Basil

Yapp, aggiungo maggiori dettagli.
superup
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.