Wie @chakrit in einem Kommentar erwähnt, können Sie diese an der Arbeit nicht erhalten durch die Umsetzung json.Marshaler
auf MyStruct
, und auf jeder Struktur eine benutzerdefinierten JSON Rangier Funktion implementiert , dass Verwendungen es viel mehr Arbeit sein können. Es hängt wirklich von Ihrem Anwendungsfall ab, ob sich die zusätzliche Arbeit lohnt oder ob Sie bereit sind, mit leeren Strukturen in Ihrem JSON zu leben, aber hier ist das Muster, das ich verwende 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
}
Wenn Sie große Strukturen mit vielen Feldern haben, kann dies mühsam werden, insbesondere wenn Sie die Implementierung einer Struktur später ändern. Wenn Sie jedoch json
nicht das gesamte Paket neu schreiben , um es Ihren Anforderungen anzupassen (keine gute Idee), ist dies so ziemlich der einzige Weg, den ich mir vorstellen kann Dies geschah, während immer noch ein Nicht-Zeiger MyStruct
drin blieb.
Außerdem müssen Sie keine Inline-Strukturen verwenden, sondern können benannte erstellen. Ich verwende LiteIDE jedoch mit Code-Vervollständigung, daher bevorzuge ich Inline, um Unordnung zu vermeiden.