Comme @chakrit l'a mentionné dans un commentaire, vous ne pouvez pas faire fonctionner ce système en implémentant json.Marshaler
sur MyStruct
et la mise en œuvre d'une fonction de triage JSON personnalisée pour chaque structure qui l'utilise peut représenter un travail beaucoup plus important. Cela dépend vraiment de votre cas d'utilisation pour savoir si cela vaut la peine de faire ce travail supplémentaire ou si vous êtes prêt à vivre avec des structures vides dans votre JSON. 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, surtout si vous changez l'implémentation d'une structure plus tard, mais à moins de réécrire l'ensemble de l'application json
pour répondre à vos besoins (ce qui n'est pas une bonne idée), c'est à peu près la seule façon à laquelle je pense de faire cela tout en conservant un paquet non pointeur. MyStruct
là-dedans.
De plus, vous n'êtes pas obligé d'utiliser des structs en ligne, vous pouvez en créer de nommés. Cependant, j'utilise LiteIDE avec la complétion de code, donc je préfère les structures en ligne pour éviter le désordre.