关于将具有未知/任意键/值对的 JSON 解组到结构中,已经提出了许多类似的问题。然而,找到的解决方案都没有提供简单而优雅的方法来实现这一点。
我们有一个 JSON 字符串,其中包含已知字段(始终存在)和未知数量的未知/任意字段。示例:
<code class="json">{"known1": "foo", "known2": "bar", "unknown1": "car", "unknown2": 1}</code>
在此示例中,known1 和known2 是已知字段,而unknown1 和unknown2 是任意字段。未知字段可以有任何名称(键)和值(字符串、布尔、float64 或 int)。
我们的目标是找到一种惯用的方法将此类 JSON 消息解析为结构。
我们可以定义以下结构:
<code class="go">type Message struct { Known1 string `json:"known1"` Known2 string `json:"known2"` Unknowns []map[string]interface{} }</code>
使用此结构,示例 JSON 消息应产生以下结果:
{Known1:foo Known2:bar Unknowns:[map[unknown1:car] map[unknown2:1]]}
另一个选项是将 JSON 解组到映射[string]接口{}:
<code class="go">import ( "encoding/json" "fmt" ) func main() { jsonMsg := `{"known1": "foo", "known2": "bar", "unknown1": "car", "unknown2": 1}` var msg map[string]interface{} fmt.Println(json.Unmarshal([]byte(jsonMsg), &msg)) fmt.Printf("%+v", msg) }</code>
这将产生:
<nil> map[known1:foo known2:bar unknown1:car unknown2:1]
的优点这种方法是我们可以迭代键和值并执行必要的类型断言来处理数据。根据我们的需要,我们可能会也可能不会用数据填充结构。
以上是如何将带有任意键/值对的 JSON 解组到 Go 中的结构中?的详细内容。更多信息请关注PHP中文网其他相关文章!