Gestion JSON des valeurs SQL NULL avec les conversions de type Go
Alors que les types Go comme Int64 et String ne peuvent pas stocker de valeurs nulles, en utilisant sql.NullInt64 et sql.NullString permet cette fonctionnalité. Cependant, l'encodage de ces types au format JSON à l'aide du package json entraîne un format modifié par rapport aux types Int64 et String classiques.
Cette divergence se produit car les types sql.Null* sont eux-mêmes des structures, ce qui provoque un niveau supplémentaire d'imbrication dans la représentation JSON. Pour surmonter ce problème, on peut implémenter des types personnalisés adhérant aux interfaces json.Marshaller et json.Unmarshaler.
Par exemple, le type JsonNullInt64 peut être défini, intégrant le type sql.NullInt64 et implémentant une gestion JSON personnalisée :
type JsonNullInt64 struct { sql.NullInt64 } func (v JsonNullInt64) MarshalJSON() ([]byte, error) { if v.Valid { return json.Marshal(v.Int64) } else { return json.Marshal(nil) } } func (v *JsonNullInt64) UnmarshalJSON(data []byte) error { // Pointer unmarshalling ensures NULL detection var x *int64 if err := json.Unmarshal(data, &x); err != nil { return err } if x != nil { v.Valid = true v.Int64 = *x } else { v.Valid = false } return nil }
Remplacer sql.NullInt64 par JsonNullInt64 aboutit au codage JSON souhaité. Pour des tests plus approfondis, reportez-vous à ce terrain de jeu : http://play.golang.org/p/zFESxLcd-c
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!