Dans cet article, nous abordons le dilemme de l'utilisation des valeurs SQL NULL dans Go et comment gérer leur Représentation JSON efficace.
Lors de l'utilisation de types Go tels que int64 et string, les valeurs nulles ne peuvent pas être directement stockées. Cependant, nous pouvons utiliser sql.NullInt64 et sql.NullString à cet effet. Cependant, lorsque ces types sont intégrés dans une structure et convertis en JSON à l'aide du package json, le format résultant s'écarte de celui obtenu lors de l'utilisation des types int64 et string normaux.
Cette disparité se produit parce que la représentation JSON de Les types sql.Null*** incluent un niveau supplémentaire car ces types sont essentiellement eux-mêmes des structures. En conséquence, il est nécessaire de trouver une solution de contournement pour obtenir le format JSON souhaité.
Au lieu d'abandonner l'utilisation de valeurs NULL dans la base de données SQL, une solution viable consiste à créer un type personnalisé qui implémente le json. Interfaces Marshaller et json.Unmarshaler. En embarquant le type sql.NullInt64, nous conservons les méthodes SQL tout en prenant le contrôle de la gestion JSON. Voici un exemple illustrant cette approche :
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 { // Unmarshalling into a pointer will let us detect null 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 }
En utilisant ce type personnalisé à la place de sql.NullInt64, la représentation JSON s'aligne sur le format souhaité.
Pour démontrer cette solution, vous pouvez exécutez le code suivant dans un terrain de jeu Go :
func main() { type Person struct { Age int64 `json:"age"` AgeJson JsonNullInt64 `json:"ageJson"` } p := Person{ Age: 10, AgeJson: sql.NullInt64{Int64: 0, Valid: true}, } b, _ := json.Marshal(p) fmt.Println(string(b)) }
Le résultat ressemblera au suivant :
{"age":10,"ageJson":10}
Cette approche permet une gestion transparente des valeurs NULL dans SQL et JSON, tout en maintenant la cohérence dans la représentation des données.
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!