【发布时间】:2023-03-03 01:58:01
【问题描述】:
我需要解析这个json
{
"version": "1.1.29-snapshot",
"linux-amd64": {
"url": "https://origin/path",
"size": 7794688,
"sha256": "14b3c3ad05e3a98d30ee7e774646aec7ffa8825a1f6f4d9c01e08bf2d8a08646"
},
"windows-amd64": {
"url": "https://origin/path",
"size": 8102400,
"sha256": "01b8b927388f774bdda4b5394e381beb592d8ef0ceed69324d1d42f6605ab56d"
}
}
像linux-amd64 这样的键是动态的,它们的数量是任意的。我尝试了类似的东西来描述它并解组。显然它不起作用。 Items 始终为空。
type FileInfo struct {
Url string `json:"url"`
Size int64 `json:"size"`
Sha256 string `json:"sha256"`
}
type UpdateInfo struct {
Version string `json:"version"`
Items map[string]FileInfo
}
类似于use case,但没有父键items。我想我可以使用 3rd 方库或 map[string]interface{} 方法,但我很想知道如何使用显式声明的类型来实现这一点。
剩下的解析代码是:
func parseUpdateJson(jsonStr []byte) (UpdateInfo, error) {
var allInfo = UpdateInfo{Items: make(map[string]FileInfo)}
var err = json.Unmarshal(jsonStr, &allInfo)
return allInfo, err
}
看看我附上的链接,你会发现这并不像你想象的那么简单。我还指出我对类型化方法感兴趣。好的,如何声明这个map[string]FileInfo被解析?
【问题讨论】:
-
如果键是动态的,那么您只能使用映射。如果您想在解码 json 时更改结构,有很多使用 json.Unmarshaler 的示例,但仍然必须在内部使用映射。
-
很明显,因为源json中没有
Items字段... -
@JimB 版本为静态,其余为动态
-
我创建了一个视频,讨论如何在 Go 中执行混合结构/映射。稍后我也许可以将其变成答案,但目前没有时间。 Watch here
-
N个动态键中的一个是静态的没关系,你仍然需要使用映射。
Items中没有任何内容,因为 JSON 中没有"items"。
标签: json go dynamic unmarshalling