正如@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与代码完成一起使用,所以我更喜欢内联以避免混乱。