我从客户端API收到了以下JSON,但我很难获得嵌套的JSON内容。如果内部键是动态的,我该如何解析它?
const jsonStream = `
{
"items": {
"bvu62fu6dq": {
"name": "john",
"age": 23,
"xyz": "weu33s"
},
"iaxdw23fq": {
"name": "kelly",
"age": 21,
"xyz": "weu33s"
}
}
}`
这是我在下面尝试循环地图以从JSON字符串中提取名称和年龄的值;但它会返回带有nil值的map。 goplaygound
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
type Item struct {
Contact struct {
Info map[string]Person
} `json:"items"`
}
func main() {
dec := json.NewDecoder(strings.NewReader(jsonStream))
for {
var item Item
if err := dec.Decode(&item); err == io.EOF {
break
} else if err != nil {
log.Fatal(err)
}
fmt.Printf("%s\n", item.Contact.Info["bvu62fu6dq"].Name)
}
}
答案 0 :(得分:3)
请尝试使用此功能,看起来您的结构设置不正确:
http://play.golang.org/p/VRKbv-GVQB
您需要解析整个json字符串,该字符串是一个包含名为items
的单个元素的对象。 items
然后包含string
- >的地图Person
个对象。
如果您只想从每个人中提取name
和age
,请抓住data.Items["bvu62fu6dq"].Name
。
如果您需要Person
内的动态密钥,则需要map[string]interface{}
代替Person
才能再次捕获动态密钥。它看起来像是:
type Data struct {
Items map[string]map[string]interface{} `json:"items"`
}
...
fmt.Printf("%v\n", data.Items["bvu62fu6dq"]["name"]
fmt.Printf("%v\n", data.Items["bvu62fu6dq"]["age"]
fmt.Printf("%v\n", data.Items["bvu62fu6dq"]["xyz"]