@Chakrit bir yorumda belirtildiği gibi, uygulayarak çalışmalarına bu alamayan json.Marshaler
üzerinde MyStruct
ve kullanımları çok daha fazla iş olabilir her yapı üzerinde özel JSON manevra fonksiyonunu uygulamak. Ekstra çalışmaya değip değmeyeceği veya JSON'nuzda boş yapılarla yaşamaya hazır olup olmadığınıza ilişkin kullanım durumunuza gerçekten bağlıdır, ancak işte benim uyguladığım kalıp 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
}
Birçok alan içeren devasa yapılarınız varsa, bu sıkıcı hale gelebilir, özellikle bir yapının uygulamasını daha sonra değiştirmek, ancak tüm json
paketi ihtiyaçlarınıza uyacak şekilde yeniden yazmaktan (iyi bir fikir değil), hemen hemen bunu elde etmek için düşünebileceğim tek yol budur. bu hala işaretçi olmayan bir şekilde yapılırMyStruct
orada .
Ayrıca, satır içi yapılar kullanmak zorunda değilsiniz, adlandırılmış yapılar oluşturabilirsiniz. Yine de kod tamamlama ile LiteIDE kullanıyorum, bu yüzden dağınıklığı önlemek için satır içi yapmayı tercih ediyorum.