Puisque la chaîne vide est la valeur zéro/par défaut pour Golang string
, j'ai décidé de définir tous ces champs tels que interface{}
à la place. par exemple
type student struct {
FirstName interface{} `json:"first_name"`
MiddleName interface{} `json:"middle_name"`
LastName interface{} `json:"last_name"`
}
L’application que j’envoie mes données s’attend à une valeur null au lieu d’une chaîne vide si la valeur n’est pas disponible pour ce champ spécifique.
Est-ce la bonne approche ou quelqu'un peut-il m'indiquer quelque chose de mieux que cela?
Dans documentation du paquet json :
Les valeurs de pointeur sont codées comme la valeur indiquée. Un pointeur nil code en tant qu'objet JSON nul.
Ainsi, vous pouvez stocker un pointeur sur une chaîne qui sera codée sous forme de chaîne si non nil et codée comme "null" si nil
type student struct {
FirstName *string `json:"first_name"`
MiddleName *string `json:"middle_name"`
LastName *string `json:"last_name"`
}
Peut être utilisé https://github.com/guregu/null
type student struct {
FirstName null.String `json:"first_name"`
MiddleName null.String `json:"middle_name"`
LastName null.String `json:"last_name"`}
Une autre solution consiste en fait à contourner la solution d’interface MarhshalJSON et UnmarshalJSON proposée par json lib de golang. Le code est comme ci-dessous:
type MyType string
type MyStruct struct {
A MyType `json:"my_type"`
}
func (c MyType) MarshalJSON() ([]byte, error) {
var buf bytes.Buffer
if len(string(c)) == 0 {
buf.WriteString(`null`)
} else {
buf.WriteString(`"` + string(c) + `"`) // add double quation mark as json format required
}
return buf.Bytes(), nil
}
func (c *MyType)UnmarshalJSON(in []byte) error {
str := string(in)
if str == `null` {
*c = ""
return nil
}
res := MyType(str)
if len(res) >= 2 {
res = res[1:len(res)-1] // remove the wrapped qutation
}
*c = res
return nil
}
puis, lors de l'utilisation de json.Marshal, la valeur de MyType sera marshalée comme nulle.