Maison >développement back-end >Golang >Comment omettre les structures imbriquées vides dans « json.Marshal » de Go ?

Comment omettre les structures imbriquées vides dans « json.Marshal » de Go ?

DDD
DDDoriginal
2024-12-09 07:49:051036parcourir

How to Omit Empty Nested Structs in Go's `json.Marshal`?

golang json marshal : comment omettre une structure imbriquée vide

Dans des scénarios d'encodage JSON complexes, on peut rencontrer des situations où les structures vides imbriquées sont également codées alors qu'elles doivent être omises pour des raisons d'espace et d'efficacité. Par exemple, considérons l'extrait de code suivant :

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

Lorsque json.Marshal est utilisé sur une instance de Total avec un champ A vide, il apparaît toujours dans le JSON de sortie :

group := Total{
    A: ColorGroup{},  // An empty ColorGroup instance
}

json.Marshal(group) // Output: {"A":{"Name":"","Colors":null},"B":null}

Le résultat souhaité est d'omettre complètement le champ A :

{"B":null}

Solution : Utiliser le pointeur Types

La clé pour résoudre ce problème réside dans l'utilisation de pointeurs. Si le champ A dans Total est déclaré comme pointeur, il sera automatiquement défini sur nul lorsqu'il n'est pas explicitement attribué, résolvant le problème de l'encodage de structure vide :

type ColorGroup struct {
    ID     int `json:",omitempty"`
    Name   string
    Colors []string
}
type Total struct {
    A *ColorGroup `json:",omitempty"`  // Using a pointer to ColorGroup
    B string     `json:",omitempty"`
}

Avec cette modification, la sortie json.Marshal omettra désormais correctement le champ A vide :

group := Total{
    B: "abc",  // Assigning a value to the B field
}

json.Marshal(group) // Output: {"B":"abc"}

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