将 json 转化为结构体,主要经过两个步骤,首先是定义合适的结构体表示这个 JSON,定义一个好用的结构,后面的工作就会变得非常简单。而第二步就是转换,直接利用 Golang 的标准库 encoding/json 就可以做到。

对于的固定键名的键值对,毫无疑问是适合组织成结构体的,比如问题中固定的 timestamp、metricname、appid、starttime、metrics,结构体类型如下:

type S struct {
    Timestamp int `json:"timestap"`
    ...
}

而对于非固定值而且不可以作为有效键名的,比如 metrics 中数据的键,就不太适合组织成结构体,明显是一个 map[string]float64 的映射。

type S struct {
    Timestamp int `json:"timestap"`
    ...
    Metrics map[string]float64 `json:"metrics"`
}

由于在 Go 中,结构体字段名的首字母大小写表示了是否可导出,而 json 在解析的时候需要利用 Go 的反射机制,必须是可导出字段,因此字段名不能作为 json 键名,要通过 struct tag 进行定义。

结构体定义完成,使用标准库 encoding/json 中的 json.Unmarshal 就可以将 json 字符串转化对应的结构体类型变量。