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"`
}
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.
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)
}