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
Susan Sarandonoriginal
2024-12-01 13:24:12162parcourir

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
}
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!

Déclaration:
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