Golang: Unmarshal/Maréchal de json avec int set à 0 ne semble pas fonctionner
Je suis en train d'analyser un json objet dans un struct, mais entier valeurs à 0 ne fonctionne pas.
q := []byte(`{"string":"this is a string", "integer": 0}`)
type Test struct {
String string `json:"string,omitempty"`
Integer int `json:"integer,omitempty"`
}
var qq Test
if err := json.Unmarshal(q, &qq); err != nil {
panic(err)
}
queryStr, err := json.Marshal(qq)
if err != nil {
panic(err)
}
fmt.Println(string(queryStr))
//Output: {"string": "this is a string"}
si j'ai mis l'entier à rien, mais 0, cela fonctionne bien.
même si je Unmarshal l'objet et de définir le champ Entier de 0, de Triage en arrière supprime le "entier" sur le terrain.
Pourquoi? et comment contourner ce problème?
MODIFIER:
de ce que je comprends les commentaires, omitempty
se déclenche lorsque la valeur est 0. Alors maintenant, la disparition du sens.
Je suis parsing json, de l'éditer et de le transmettre à un autre service, ce qui est regrettable, d'autant que le terrain présente pas de défaut à d'autres valeurs que 0, et je préférerais ne pas avoir à l'alimentation dans les paramètres par défaut de l'aval de l'API.
Donc est-il possible d'omettre des valeurs vides mais gardez 0?
ou modifier vide de quelque chose d'autre?
Dois-je avoir 2 structures: l'une pour l'entrée et un pour la sortie?
omitempty
, et 0 est la valeur vide.j'ai besoin de omitemtpy que je ne peut pas avoir le champ tout mais j'ai aussi besoin de la valeur à 0. donc, il y a un moyen de contourner cela?
si le champ n'est pas présent, dans le programme, il est utilisé dans, la valeur par défaut d'une valeur qui n'est pas 0. Donc pas de champ par défaut-à-dire 10, mais j'ai besoin d'être en mesure de 0. Est-il moyen de définir une valeur par défaut pour une structure de champ?
OriginalL'auteur MrE | 2016-07-20
Vous devez vous connecter pour publier un commentaire.
Utiliser un pointeur pour les champs, de sorte que la valeur zéro de l'JSON type peut être différenciée de la valeur manquante.
https://play.golang.org/p/yvYSHxubLy
OriginalL'auteur JimB
"omitempty" tag n'a de sens que pour le marshaling de struct à JSON. Il ignore les valeurs vides de sorte qu'ils ne seront pas dans JSON. Il n'a pas d'incidence sur le désordonnancement en aucune façon. Utiliser des pointeurs si vous voulez détecter si le champ est spécifié dans JSON ou pas. Si le champ n'est pas spécifié, la valeur du pointeur sera néant.
OriginalL'auteur Barberry
que les docs dit dans https://golang.org/pkg/encoding/json/#Marshal
donc pas, sauf si vous implémentez votre propre marshaller pour votre struct
OriginalL'auteur Javier Neyra