在JSON解组后自动创建计算字段

时间:2015-10-23 09:32:59

标签: go unmarshalling

简化示例

假设我有一个结构用于解组一些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字段吗?

1 个答案:

答案 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
}

游乐场:http://play.golang.org/p/g9BnytB5DG