json - 编组大型非结构化 REST/JSON 响应
问题描述
我花了很长时间弄清楚如何将大型非结构化 json 响应解组为可用对象。
这是一个示例响应(修剪以显示我遇到问题的部分)
由于这是一个非常大的 json 响应,因此已大大减少。为简单起见,我也将结构标记留在了下面。
{
"responseStatus": "ok",
"responseHeader": {
"status": "ok",
"requestId": "blah"
},
"responseData": {
"records": [
{
"name": "blah",
"site": {
"id": 1,
"name": "west"
},
"somevar1": "someval",
"somevar2": {
"x": 2,
"y": 1
},
"entries": [
{
"model": "100",
},
{
"model": "200",
}
]
},
]
}
所以记录是一个很大的“对象”列表。我需要将它们转换为我定义的类型。“条目”列表也需要转换为其对象类型。
type Record struct {
Name string
Site map[string]string
Somevar1 string
Somevar2 map[string]string
Entries []Entry
}
type Entry struct {
Model string
}
在这里,我可以将 responseData 放入一个可以迭代的对象中:
results := data["responseData"].(map[string]interface{})
devices := results["records"].([]interface{})
for _, device := range devices {
fmt.Fprintf(os.Stdout, "%T\n", device)
fmt.Fprintf(os.Stdout, "%+v\n", device)
}
这是 1 次迭代的示例输出:
map[string]interface {}
map[name:foo site:map[id:2 name:somewhere somevar1: blah somevar2:map[x:1 y:2] entries:[map[model:100] map[model:200]
这就是我卡住的地方。我需要使用上面的这一行并将其转换为我的类型 Record,同时还将条目转换为 []Entry。
解决方案
Site
将andSomevar2
字段更改为map[string]interface{}
或更改为适当的结构,因为它们对应的 json 包含整数,所以当你只使用map[string]string
它时会失败。
除此之外,您的代码可以使用https://play.golang.com/p/rTgaXhXD1V6
推荐阅读
- javascript - 如何使用 ngModel 以角度绑定三个不同的输入?
- swift - UITests 和 React Native Header TouchableOpacity
- git - 将 git 存储库克隆到 pycharm
- java - 如何从 2 类客户和巴士创建 BookingList
- html - 目标伪类不隐藏内容
- c# - C# 以资源有效的方式比较列表
- javascript - 给定值时,图像不从 const 显示
- javascript - 在 Leaflet.js 中消除光栅图像上的白色、无数据像素时遇到问题,通过 GeoServer 提供服务
- mongodb - 带有副本集备份的 Kubernetes mongodb
- amazon-web-services - Docker Elastic Beanstalk 部署问题:CREATE 有效,但 DEPLOY 失败