@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를 사용하므로 혼란을 피하기 위해 인라인을 선호합니다.