Maison >développement back-end >Golang >Comment puis-je faire la distinction entre les champs JSON nuls et manquants lors du démarshalage dans Go ?

Comment puis-je faire la distinction entre les champs JSON nuls et manquants lors du démarshalage dans Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-03 21:03:17400parcourir

How Can I Distinguish Between JSON Null and Missing Fields When Unmarshaling in Go?

Distinguer les champs JSON définis sur Null et non présents lors du démarshalage

Lors du démarshalage de JSON dans une structure Golang, différenciation entre les champs définis sur null et les champs qui ne sont pas présents peuvent être cruciaux. Les deux scénarios aboutissent à des valeurs nulles dans la structure, obscurcissant la sémantique prévue.

Différenciation à l'aide de génériques (Go 1.18)

Go 1.18 introduit des génériques, permettant une solution concise avec un seul type générique :

type Optional[T any] struct {
    Defined bool
    Value   *T
}

Ce type encapsule le concept d'une valeur facultative avec un état de champ défini (Défini).

Exemple d'utilisation :

type Payload struct {
    Field1 Optional[string] `json:"field1"`
    Field2 Optional[int]   `json:"field2"`
}

Après le démarshaling, les champs avec des valeurs définies (Défini == true) peut faire la distinction entre les valeurs nulles (Value == nil) et les valeurs manquantes (Defined == false).

Solutions pré-génériques

Wrapper de type personnalisé :

type OptionalString struct {
    Defined bool
    Value   *string
}

func (os *OptionalString) UnmarshalJSON(data []byte) error {
    os.Defined = true
    return json.Unmarshal(data, &os.Value)
}

Exemple Utilisation :

type Payload struct {
    Field1 string         `json:"field1"`
    Field2 OptionalString `json:"field2"`
}

Limitations :

  • Nécessite un wrapper de structure dédié pour chaque type pris en charge (par exemple, OptionNumber pour les types numériques).
  • Ne fournit pas de distinction complète entre les valeurs nulles et manquantes.

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