Golang: Pattern: Decode JSON with Dynamic Fields

8th November 2021 at 5:00pm

在 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.RawMessageRawMessage 本质上是个 []byte,是 JSON 在 Unmarshall 时把相应的 []byte 存下来,让你在后面再去操作。但这种做法会复制一遍数据,性能比较差。就不再上示例代码了。