web-dev-qa-db-fra.com

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

aller au terrain de je

Comme indiqué dans le code ci-dessus, on peut utiliser json:",omitempty" Pour omettre certains champs dans une structure pour apparaître dans json.

Par exemple

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{},

}

Dans ce cas, B n'apparaîtra pas dans json.Marshal(group)

Toutefois, si

group := Total{
       B:"abc",

}

A apparaît toujours dans json.Marshal(group)

{"A":{"Name":"","Colors":null},"B":"abc"}

La question est de savoir comment obtenir seulement

{"B":"abc"}

EDIT: Après quelques recherches sur Google, voici une suggestion tilisez le pointeur , en d'autres termes, transformez Total en

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

De la documentation :

Les valeurs de structure sont codées en tant qu'objets JSON. Chaque champ struct exporté devient membre de l'objet sauf si

  • la balise du champ est "-", ou
  • le champ est vide et sa balise spécifie l'option "omitempty".

Les valeurs vides sont false, 0, tout pointeur nul ou valeur d'interface, et tout tableau, tranche, carte ou chaîne de longueur zéro.

Dans votre déclaration de group, il est implicite que group.A sera la valeur zéro du type de structure ColorGroup. Et notez que zéro-valeurs-de-struct-types n'est pas mentionné dans cette liste de choses qui sont considérées comme des "valeurs vides".

Comme vous l'avez constaté, la solution de contournement pour votre cas consiste à utiliser un pointeur. Cela fonctionnera si vous ne spécifiez pas A dans votre déclaration de group. Si vous spécifiez qu'il s'agit d'un pointeur vers une structure nulle, il réapparaîtra.

lien aire de jeux :

package main

import (
    "encoding/json"
    "fmt"
    "os"
)

func main() {
    type colorGroup struct {
        ID     int `json:",omitempty"`
        Name   string
        Colors []string
    }
    type total struct {
        A *colorGroup `json:",omitempty"`
        B string     `json:",omitempty"`
    }

    groupWithNilA := total{
        B: "abc",
    }
    b, err := json.Marshal(groupWithNilA)
    if err != nil {
        fmt.Println("error:", err)
    }
    os.Stderr.Write(b)

    println()

    groupWithPointerToZeroA := total{
        A: &colorGroup{},
        B: "abc",
    }
    b, err = json.Marshal(groupWithPointerToZeroA)
    if err != nil {
        fmt.Println("error:", err)
    }
    os.Stderr.Write(b)
}
29
Amit Kumar Gupta