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

    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?

Doug Knesek
la source

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

Dessus de muffin
la source
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
 }
Sourabh Bhagat
la source
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.

super-haut
la source
1
ajouter plus de détails
Basil
Yapp, j'ajoute plus de détails.
superup