简化示例
假设我有一个结构用于解组一些json:
type DataEntry struct {
FirstName string `json:"first"`
LastName string `json:"last"`
FullName string
}
我想要填充FullName
属性,即FirstName + LastName
。
我目前正在做的是为DataEntry定义一个方法,它进行这些计算:
func (de *DataEntry) Compute() {
de.FullName = de.FirstName + " " + de.LastName
}
并在从JSON填充结构后调用:
// Grab data
request, _ := http.Get("http://........")
var entry DataEntry
dec := json.NewDecoder(request.Body)
dec.Decode(&entry)
// Compute the computed fields
entry.Compute()
有更好的方法吗?我可以使用创建自己的UnmarshalJSON
并将其用作触发器来自动计算FullName
字段吗?
答案 0 :(得分:3)
在这种情况下,我只需将FullName
转换为方法。但是如果你真的需要这样做,只需创建一个同样是json.Unmarshaler
的包装类型:
type DataEntryForJSON DataEntry
func (d *DataEntryForJSON) UnmarshalJSON(b []byte) error {
if err := json.Unmarshal(b, (*DataEntry)(d)); err != nil {
return err
}
d.FullName = d.FirstName + " " + d.LastName
return nil
}