JSON 嵌套动态结构 Go 解码

Spo*_*ouk 1 json struct go

有一个关于输入数据的示例。

\n\n
{\n    "status": "OK",\n    "status_code": 100,\n    "sms": {\n        "79607891234": {\n            "status": "ERROR",\n            "status_code": 203,\n            "status_text": "\xd0\x9d\xd0\xb5\xd1\x82 \xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82\xd0\xb0 \xd1\x81\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x89\xd0\xb5\xd0\xbd\xd0\xb8\xd1\x8f"\n        },\n        "79035671233": {\n            "status": "ERROR",\n            "status_code": 203,\n            "status_text": "\xd0\x9d\xd0\xb5\xd1\x82 \xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82\xd0\xb0 \xd1\x81\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x89\xd0\xb5\xd0\xbd\xd0\xb8\xd1\x8f"\n        },\n        "79105432212": {\n            "status": "ERROR",\n            "status_code": 203,\n            "status_text": "\xd0\x9d\xd0\xb5\xd1\x82 \xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82\xd0\xb0 \xd1\x81\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x89\xd0\xb5\xd0\xbd\xd0\xb8\xd1\x8f"\n        }\n    },\n    "balance": 2676.18\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n
{\n    "status": "OK",\n    "status_code": 100,\n    "sms": {\n        "79607891234": {\n            "status": "ERROR",\n            "status_code": 203,\n            "status_text": "\xd0\x9d\xd0\xb5\xd1\x82 \xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82\xd0\xb0 \xd1\x81\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x89\xd0\xb5\xd0\xbd\xd0\xb8\xd1\x8f"\n        },\n        "79035671233": {\n            "status": "ERROR",\n            "status_code": 203,\n            "status_text": "\xd0\x9d\xd0\xb5\xd1\x82 \xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82\xd0\xb0 \xd1\x81\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x89\xd0\xb5\xd0\xbd\xd0\xb8\xd1\x8f"\n        },\n        "79105432212": {\n            "status": "ERROR",\n            "status_code": 203,\n            "status_text": "\xd0\x9d\xd0\xb5\xd1\x82 \xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82\xd0\xb0 \xd1\x81\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x89\xd0\xb5\xd0\xbd\xd0\xb8\xd1\x8f"\n        }\n    },\n    "balance": 2676.18\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我向服务器发出适当请求后收到的数据的示例。我得到了这样的数据。这样的数据如何序列化呢?由于嵌套结构列表的动态名称,我的尝试失败了。\n如何正确处理此类嵌套动态结构?

\n

icz*_*cza 5

使用映射(类型为map[string]SMSPhone)对smsJSON 中的对象进行建模:

\n\n
type SMSPhone struct {\n    Status     string `json:"status"`\n    StatusCode int    `json:"status_code"`\n    StatusText string `json:"status_text"`\n}\n\ntype SMSSendJSON struct {\n    Status     string              `json:"status"`\n    StatusCode int                 `json:"status_code"`\n    Sms        map[string]SMSPhone `json:"sms"`\n    Balance    float64             `json:"balance"`\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后解组:

\n\n
var result SMSSendJSON\n\nif err := json.Unmarshal([]byte(src), &result); err != nil {\n    panic(err)\n}\nfmt.Printf("%+v", result)\n
Run Code Online (Sandbox Code Playgroud)\n\n

将导致(在Go Playground上尝试):

\n\n
\n

{状态:正常状态代码:100短信:地图[79035671233:{状态:错误状态代码:203 StatusText:\ xd0 \ x9d \ xd0 \ xb5 \ xd1 \ x82 \ xd1 \ x82 \ xd0 \ xb5 \ xd0 \ xba \ xd1 \ x81 \xd1\x82\xd0\xb0\xd1\x81\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x89\xd0\xb5\xd0\xbd\xd0\xb8\xd1\x8f} 79105432212:{状态:错误状态代码:203 状态文本:\xd0\x9d\xd0\xb5\xd1\x82 \xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82\xd0\xb0 \xd1\x81\xd0\xbe \xd0\xbe\xd0\xb1\xd1\x89\xd0\xb5\xd0\xbd\xd0\xb8\xd1\x8f} 79607891234:{状态:错误 StatusCode:203 StatusText:\xd0\x9d\xd0\xb5\xd1 \x82 \xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82\xd0\xb0 \xd1\x81\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x89\xd0\xb5 \xd0\xbd\xd0\xb8\xd1\x8f}] 余额:2676.18}

\n
\n\n

映射中的键result.Sms是对象的“动态”属性,即电话号码。

\n\n

查看相关问题:

\n\n

如何在 Golang 中解析/反序列化动态 JSON

\n\n

如何将未知字段名的 JSON 解组为 golang 中的结构?

\n\n

解组具有未知字段的 JSON

\n\n

将 json 字符串解组到一个结构体,该结构体具有该结构体本身的一个元素

\n