Seperti @chakrit disebutkan dalam komentar, Anda tidak bisa mendapatkan ini untuk bekerja dengan menerapkan json.Marshaler
pada MyStruct
, dan menerapkan JSON kustom fungsi marshalling pada setiap struct yang menggunakan hal itu dapat lebih banyak bekerja. Itu benar-benar tergantung pada kasus penggunaan Anda, apakah itu sepadan dengan kerja ekstra atau apakah Anda siap untuk hidup dengan struct kosong di JSON Anda, tetapi inilah pola yang saya gunakan yang diterapkan 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
}
Jika Anda memiliki struct besar dengan banyak bidang, ini bisa menjadi membosankan, terutama mengubah implementasi struct nanti, tetapi singkatnya menulis ulang seluruh json
paket agar sesuai dengan kebutuhan Anda (bukan ide yang baik), ini adalah satu-satunya cara yang bisa saya pikirkan untuk mendapatkannya ini dilakukan sambil tetap menyimpan non-pointer MyStruct
di sana.
Selain itu, Anda tidak harus menggunakan struct inline, Anda dapat membuat yang bernama. Saya menggunakan LiteIDE dengan penyelesaian kode, jadi saya lebih suka sebaris untuk menghindari kekacauan.