首页 > 后端开发 > Golang > 正文

如何将带有任意键/值对的 JSON 解组到 Go 中的结构中?

DDD
发布: 2024-10-26 16:35:30
原创
730 人浏览过

How to Unmarshal JSON with Arbitrary Key/Value Pairs into a Struct in Go?

Unmarshal JSON with Arbitrary Key/Value Pairs to Struct

关于将具有未知/任意键/值对的 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!