在 JSON 的 field 是确定的情况下,用 Go 的 encoding/json 标准库可以很容易实现 decode。比如:
type Data struct {
A int `json:"a"`
B int `json:"b"`
}
func decode() {
d := Data{}
s := []byte(`{"a": 1, "b": 2}`)
json.Unmarshal(s, &d)
}
但是当 field 不是确定的情况下(比如除了 "a" "b" 之外还有其他不确定的 field),常见的方式是将其 unmarshal 到一个 map[string]interface{}
再做解析。这篇 SO 帖子 提供了一些常见的方式。
另外一种做法是用 json.RawMessage
。RawMessage
本质上是个 []byte
,是 JSON 在 Unmarshall 时把相应的 []byte
存下来,让你在后面再去操作。但这种做法会复制一遍数据,性能比较差。就不再上示例代码了。