json.Marshal (struct) renvoie «{}»


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

Voici la sortie:

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

Pourquoi le JSON est-il essentiellement vide?

Réponses:


233

Vous devez exporter les champs dans TestObject en mettant en majuscule la première lettre du nom du champ. Changez kindpour Kindet 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.

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

playground


il n'y a pas de "espace" avant "omitempty"
Damon

Puis-je faire avec une petite lettre?
user123456

Si vous voulez une petite lettre tag les champs stackoverflow.com/questions/21825322
...

1
@ user123456 Définissez le nom du champ JSON en minuscules à l'aide de la jsonbalise field (comme décrit dans le dernier paragraphe de cette réponse).
Muffin Top

28
  • Lorsque la première lettre est en majuscule , l'identifiant est public pour tout morceau 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 qu'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
 }

3
homme génial, travail parfait ne change que la première lettre en majuscule, merci beaucoup
vuhung3990

2
Exactement, In Go, a name is exported if it begins with a capital letter. Pour le mettre en contexte, visitez ce Go Basics Tour
Mohsin

3

Dans Golang

dans la structure, la première lettre doit être en majuscule ex. phoneNumber -> PhoneNumber

======= Ajouter des détails

D'abord, j'essaye de coder comme ça

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

golang compile n'est pas une erreur et ne montre pas d'avertissement. Mais la réponse est vide parce que quelque chose

Après cela, je recherche google a trouvé cet article

Article sur les types de structure et les littéraux de type de structure alors ... J'essaye de modifier le code.

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

C'est du travail.

J'espère de l'aide.


1
ajouter plus de détails
Basil

Yapp, j'ajoute plus de détails.
superup
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.