Maison >développement back-end >Golang >Comment puis-je faire la différence entre les champs JSON nuls et absents dans Go ?
Différencier les champs JSON nuls des champs JSON absents dans Go
Dans Go, lors de la désorganisation des données JSON dans une structure, il en résulte à la fois des champs nuls et des champs absents en valeurs nulles dans la structure résultante. Cela peut être un défi lorsqu'il est essentiel de faire la distinction entre les deux scénarios, par exemple lorsqu'un champ nul signifie une intention spécifique alors que son absence indique qu'il n'a jamais été présent.
Utilisation de structures facultatives (Go 1.18)
Pour Go 1.18 et versions ultérieures, les génériques permettent une solution simple en utilisant une structure personnalisée : Facultatif[T]. Cette structure intègre un champ booléen défini, qui indique la présence du champ dans la charge utile JSON, et un champ Valeur, qui contient la valeur réelle. Lors de la désorganisation, si la valeur est définie (non nulle), UnmarshalJSON est invoqué, définissant les champs Défini et Valeur de manière appropriée.
type Optional[T any] struct { Defined bool Value *T }
type Payload struct { Field1 Optional[string] `json:"field1"` Field2 Optional[bool] `json:"field2"` Field3 Optional[int32] `json:"field3"` }
En vérifiant le champ Défini, vous pouvez discerner si un champ a été null ou non défini.
Unmarshaler personnalisé avec Pré-génériques
Avant Go 1.18, un Unmarshaler personnalisé peut être utilisé à cette fin :
type OptionalString struct { Defined bool Value *string } func (os *OptionalString) UnmarshalJSON(data []byte) error { // UnmarshalJSON is called only if the key is present os.Defined = true return json.Unmarshal(data, &os.Value) }
type Payload struct { SomeField1 string `json:"somefield1"` SomeField2 OptionalString `json:"somefield2"` }
Dans cette approche, la structure OptionString implémente le json. Interface Unmarshaler, définissant Defined sur true lorsque le champ est présent dans la charge utile JSON. Cela permet de différencier les champs nuls de ceux absents.
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!