Maison > développement back-end > Golang > Comment puis-je faire la différence entre les champs JSON nuls et absents dans Go ?

Comment puis-je faire la différence entre les champs JSON nuls et absents dans Go ?

Susan Sarandon
Libérer: 2024-12-01 13:24:12
original
256 Les gens l'ont consulté

How Can I Differentiate Between Null and Absent JSON Fields in 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
}
Copier après la connexion
type Payload struct {
    Field1 Optional[string] `json:"field1"`
    Field2 Optional[bool]   `json:"field2"`
    Field3 Optional[int32]  `json:"field3"`
}
Copier après la connexion

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)
}
Copier après la connexion
type Payload struct {
    SomeField1 string         `json:"somefield1"`
    SomeField2 OptionalString `json:"somefield2"`
}
Copier après la connexion

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal