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
Susan Sarandonoriginal
2024-12-18 06:41:10555parcourir

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)

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)

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!

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