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

如何在 Golang 中使用动态嵌套结构解码 JSON?

DDD
发布: 2024-11-17 08:46:03
原创
466 人浏览过

How to Decode JSON with Dynamic Nested Structures in Golang?

JSON 嵌套动态结构 Go 解码

在处理嵌套结构中包含动态或未知字段名称的 JSON 数据时,经常会遇到这种情况。当尝试准确地反序列化和处理数据时,这可能会带来挑战。

示例数据

考虑服务器请求后收到的以下 JSON 数据:

{
    "status": "OK",
    "status_code": 100,
    "sms": {
        "79607891234": {
            "status": "ERROR",
            "status_code": 203,
            "status_text": "Нет текста сообщения"
        },
        "79035671233": {
            "status": "ERROR",
            "status_code": 203,
            "status_text": "Нет текста сообщения"
        },
        "79105432212": {
            "status": "ERROR",
            "status_code": 203,
            "status_text": "Нет текста сообщения"
        }
    },
    "balance": 2676.18
}
登录后复制

自定义类型定义

要处理这种动态结构,可以使用自定义类型定义:

type SMSPhone struct {
    Status     string `json:"status"`
    StatusCode int    `json:"status_code"`
    StatusText string `json:"status_text"`
}

type SMSSendJSON struct {
    Status     string     `json:"status"`
    StatusCode int        `json:"status_code"`
    Sms        []SMSPhone `json:"sms"`
    Balance    float64    `json:"balance"`
}
登录后复制

使用映射

由于 JSON 中的 sms 对象具有动态键,因此可以使用以电话号码为键、以 SMSPhone 结构体为值的映射对其进行建模:

type SMSPhone struct {
    Status     string `json:"status"`
    StatusCode int    `json:"status_code"`
    StatusText string `json:"status_text"`
}

type SMSSendJSON struct {
    Status     string              `json:"status"`
    StatusCode int                 `json:"status_code"`
    Sms        map[string]SMSPhone `json:"sms"`
    Balance    float64             `json:"balance"`
}
登录后复制

解组

使用定义的自定义类型,可以按如下方式解组数据:

var result SMSSendJSON

if err := json.Unmarshal([]byte(src), &result); err != nil {
    panic(err)
}
fmt.Printf("%+v", result)
登录后复制

这将产生一个正确反序列化的对象,其中动态电话号码作为键result.Sms map。

相关问题

  • 如何在 Golang 中解析/反序列化动态 JSON
  • 如何用未知的方式解组 JSON golang 中要构造的字段名?
  • 解组具有未知字段的 JSON
  • 将 json 字符串解组为具有结构本身一个元素的结构

以上是如何在 Golang 中使用动态嵌套结构解码 JSON?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板