如果嵌套内容使用动态密钥,我如何在GoLang中解析JSON?

时间:2015-09-27 07:09:57

标签: json parsing go

我从客户端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)
    }
}

1 个答案:

答案 0 :(得分:3)

请尝试使用此功能,看起来您的结构设置不正确:

http://play.golang.org/p/VRKbv-GVQB

您需要解析整个json字符串,该字符串是一个包含名为items的单个元素的对象。 items然后包含string - >的地图Person个对象。

如果您只想从每个人中提取nameage,请抓住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"]