【发布时间】:2021-11-25 22:45:54
【问题描述】:
我有一个 JSON 结构,例如:
{
"persons":[
{
"name":"mark",
"surname":"zuckerberg",
"data":[
{
"userid":"09210",
"username":"mark290",
"registered_date":"10-01-2017"
},
{
"userid":"092240",
"username":"mark291",
"registered_date":"11-01-2017"
}
]
},
{
"name":"bill",
"surname":"clinton",
"data":[
{
"userid":"0442340",
"username":"billy",
"registered_date":"10-01-2000"
},
{
"userid":"89472894",
"username":"billary",
"registered_date":"11-01-2015"
}
]
}
]
}
我需要获取每个人的每个用户名。 目前,在我完全是新手的 Go 中,我只能使用这个 sn-p 获取“数据”中的单个 JSONS:
j := []byte(data)
var f interface{}
err := json.Unmarshal(j, &f)
map := f.(map[string]interface{})
for _,item := range map["persons"].([]interface{}) {
fmt.Printf("%v", item.(map[string]interface{})["data"])
fmt.Println(err)
我很难理解如何深入数据中的每个 JSON 结构以获得每个键值对。
【问题讨论】:
-
考虑使用具体类型而不是
interface{}。 -
声明一个与你的数据结构相匹配的 Go 类型。解组为该类型的值。见example。
-
但我忘了提到,在我的例子中,JSON 结构并不总是相同的。这是不一致的。我认为在这种情况下最好使用接口而不是结构。
-
github.com/mitchellh/mapstructure "数据格式不一致" 几乎是 mapstructure 的准确定位。仅使用接口和映射的问题是您必须检查所有类型。结构 ummarshalling 为您处理。