【问题标题】:How can I parse JSON in GoLang if nested content uses dynamic keys?如果嵌套内容使用动态键,如何在 GoLang 中解析 JSON?
【发布时间】:2015-09-27 07:09:57
【问题描述】:

我从客户端 API 收到下面的 JSON,但我很难获得嵌套的 JSON 内容。如果内部键是动态的,我该如何解析它?

const jsonStream = `
{
    "items": {
        "bvu62fu6dq": {
            "name": "john",
            "age": 23,
            "xyz": "weu33s"
        },
        "iaxdw23fq": {
            "name": "kelly",
            "age": 21,
            "xyz": "weu33s"
        }
    }
}`

这是我在下面通过循环映射以从上面的 JSON 字符串中提取姓名和年龄的值来尝试的;但它返回值为零的地图作为结果。 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)
    }
}

【问题讨论】:

  • 你能编辑你的问题来解释唯一键的意义吗?仅在标题中提及
  • 如果你这么说会更容易,而且你需要以什么形式获得。

标签: json parsing go


【解决方案1】:

试试这个,看起来你的结构设置不正确:

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"]

【讨论】:

    猜你喜欢
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    相关资源
    最近更新 更多