Comme @chakrit mentionné dans un commentaire, vous ne pouvez pas obtenir ce travail en mettant en place json.Marshaler
sur MyStruct
et la mise en œuvre d' une fonction de rassemblement JSON personnalisé sur chaque struct qui l' utilise peut être beaucoup plus de travail. Cela dépend vraiment de votre cas d'utilisation pour savoir si cela vaut le travail supplémentaire ou si vous êtes prêt à vivre avec des structures vides dans votre JSON, mais voici le modèle que j'utilise appliqué à Result
:
type Result struct {
Data MyStruct
Status string
Reason string
}
func (r Result) MarshalJSON() ([]byte, error) {
return json.Marshal(struct {
Data *MyStruct `json:"data,omitempty"`
Status string `json:"status,omitempty"`
Reason string `json:"reason,omitempty"`
}{
Data: &r.Data,
Status: r.Status,
Reason: r.Reason,
})
}
func (r *Result) UnmarshalJSON(b []byte) error {
decoded := new(struct {
Data *MyStruct `json:"data,omitempty"`
Status string `json:"status,omitempty"`
Reason string `json:"reason,omitempty"`
})
err := json.Unmarshal(b, decoded)
if err == nil {
r.Data = decoded.Data
r.Status = decoded.Status
r.Reason = decoded.Reason
}
return err
}
Si vous avez d'énormes structures avec de nombreux champs, cela peut devenir fastidieux, en particulier en changeant l'implémentation d'une structure plus tard, mais à moins de réécrire l'ensemble du json
package pour répondre à vos besoins (ce n'est pas une bonne idée), c'est à peu près la seule façon dont je peux penser à obtenir ceci fait tout en gardant un non-pointeur MyStruct
là - dedans.
De plus, vous n'avez pas besoin d'utiliser des structures en ligne, vous pouvez en créer des nommées. J'utilise LiteIDE avec la complétion de code, donc je préfère en ligne pour éviter l'encombrement.