Maison > développement back-end > Golang > Comment gérer correctement les structures vides imbriquées lors du marshaling vers JSON dans Go ?

Comment gérer correctement les structures vides imbriquées lors du marshaling vers JSON dans Go ?

Susan Sarandon
Libérer: 2024-12-18 06:41:10
original
553 Les gens l'ont consulté

How Do I Properly Handle Nested Empty Structs When Marshaling to JSON in Go?

Gestion des structures vides imbriquées dans le marshaling JSON dans Go

Introduction

Lors de l'utilisation de l'encodage /json dans Go pour le marshalling des structures vers JSON, la balise ",omitempty" peut être utilisée pour exclure les champs vides du JSON résultant. Cependant, cette balise peut ne pas se comporter comme prévu pour les structures imbriquées.

Question

Considérez l'exemple suivant :

type ColorGroup struct {
    ID     int `json:",omitempty"`
    Name   string
    Colors []string
}

type Total struct {
    A ColorGroup `json:",omitempty"`
    B string    `json:",omitempty"`
}

group := Total{
    A: ColorGroup{},
}

json.Marshal(group)
Copier après la connexion

Dans ce scénario, la sortie JSON ne doit inclure que le champ B, puisque le champ A est vide. Cependant, la sortie inclut toujours le champ A avec des valeurs vides ({"A": {"Name": "", "Colors": null}, "B": null}).

Réponse

La documentation sur le marshaling JSON dans Go indique que les champs de structure sont considérés comme vides s'ils sont :

  • Nil pointeurs
  • Valeurs nulles (par exemple, false, 0)

Dans l'exemple fourni, group.A est une structure vide, pas un pointeur nul ou un type de collection (par exemple, slice , carte). Par conséquent, il n'est pas traité comme une valeur vide par le marshaleur.

Pour obtenir le comportement souhaité, on peut utiliser un pointeur vers la structure imbriquée :

type ColorGroup struct {
    ID     int `json:",omitempty"`
    Name   string
    Colors []string
}

type Total struct {
    A *ColorGroup `json:",omitempty"`
    B string    `json:",omitempty"`
}

group := Total{
    B: "abc",
}

json.Marshal(group)
Copier après la connexion

Avec cette modification, le JSON la sortie inclura uniquement le champ B : {"B": "abc"}.

Remarque :

  • Si un pointeur vers une structure non nulle est passé, il sera inclus dans la sortie JSON, même s'il est vide.
  • Cette solution ne peut être appliquée qu'aux structures imbriquées. Pour les structures vides non imbriquées, l'utilisation de la balise ",omitempty" sans pointeurs suffira.

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!

source:php.cn
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