web-dev-qa-db-fra.com

JSON golang boolean omitempty

J'ai des problèmes avec l'écriture d'une bibliothèque golang pour une api. L'aspect json des booléens est à l'origine de problèmes.

Disons que la valeur par défaut d'un booléen est vraie pour un appel api.

Si je fais

SomeValue bool `json:some_value,omitempty`

et je ne définit pas la valeur via la bibliothèque, la valeur sera définie sur true. Si je mets la valeur false dans la bibliothèque, omitempty dit qu'une fausse valeur est une valeur vide, donc la valeur restera vraie pendant l'appel api.

Supprimons l'omitempty et faisons-le ressembler à ceci

SomeValue bool `json:some_value`

Maintenant, j'ai le problème opposé, je peux définir la valeur sur false mais si je ne la définit pas, la valeur sera fausse même si je m'attends à ce qu'elle soit vraie.

Edit: Comment puis-je conserver le comportement de ne pas avoir à définir la valeur sur true tout en étant capable de définir la valeur sur false?

24
mbfrahry

Utilisez des pointeurs

package main

import (
    "encoding/json"
    "fmt"
)

type SomeStruct struct {
    SomeValue *bool `json:"some_value,omitempty"`
}

func main() {
    t := new(bool)
    f := new(bool)

    *t = true
    *f = false

    s1, _ := json.Marshal(SomeStruct{nil})
    s2, _ := json.Marshal(SomeStruct{t})
    s3, _ := json.Marshal(SomeStruct{f})

    fmt.Println(string(s1))
    fmt.Println(string(s2))
    fmt.Println(string(s3))
}

Production:

{}
{"some_value":true}
{"some_value":false}
32
gavv