Как @chakrit упоминались в комментариях, вы не можете получить эту работу по реализации json.Marshaler
на MyStruct
и реализации функции сортировочной пользовательских JSON на каждую структуру , которая использует это может быть намного больше работы. Это действительно зависит от вашего варианта использования относительно того, стоит ли дополнительная работа или вы готовы жить с пустыми структурами в своем 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
}
Если у вас есть огромные структуры с множеством полей, это может стать утомительным, особенно изменение реализации структуры позже, но если json
не считать переписывания всего пакета в соответствии с вашими потребностями (не очень хорошая идея), это в значительной степени единственный способ получить это сделано при сохранении не указателяMyStruct
.
Кроме того, вам не обязательно использовать встроенные структуры, вы можете создавать именованные. Однако я использую LiteIDE с автозавершением кода, поэтому предпочитаю встроенный, чтобы избежать беспорядка.