首页 >后端开发 >Golang >如何在 Golang 中使用动态嵌套结构解码 JSON?

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

DDD
DDD原创
2024-11-17 08:46:03548浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn