[转到]:解析JSON [重复]

问题描述 投票:-1回答:1

这个问题在这里已有答案:

我想做什么 我正在解析基于this回答类似问题的JSON HTTP响应。我的代码能够解析JSON而没有任何错误,但无法读取值并将它们存储在提供的变量中。在过去的2个小时里,这让我感到困惑,这可能是由于我在这里忽略了一个微不足道的原因。

type ImporterResponse struct {
    results []packagemeta `json:"results"`
}

type packagemeta struct {
    path     string `json:"path"`
    synopsis string `json:"synopsis,omitempty"`
    count    int    `json:"import_count,omitempty`
}


func main() {

    res := []byte(`{"results":[{"path":"4d63.com/randstr/lib/randstr","import_count":0,"synopsis":"Package randstr generates random strings (e.g."},{"path":"bitbucket.org/pcas/tool/mathutil","import_count":0}]}`)
    fmt.Println("Decoding the JSON")

    r := bytes.NewReader(res)
    decoder := json.NewDecoder(r)

    packageimporters := &ImporterResponse{}
    err := decoder.Decode(packageimporters)

    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Packageimporters: %+v", packageimporters)
    fmt.Println(len(packageimporters.results))
}

链接到游乐场:https://play.golang.org/p/NzLl7Ujo2IJ

我想要的是:

  1. 如何解决这个问题?
  2. 如果没有正确解析JSON,为什么没有出现错误消息?

P.S:我知道之前已经问过这个问题并且有可能的解决方案,但它们都不适用于我。因此,我发了这篇文章。

json go
1个回答
2
投票

您需要导出结构字段,否则json包无法访问它们。

请阅读JSON and go了解更多详情,特别是本段:

json包只访问struct类型的导出字段(以大写字母开头的字段)。因此,只有结构的导出字段才会出现在JSON输出中。

这一个更详细:

Unmarshal如何识别存储解码数据的字段?对于给定的JSON键“Foo”,Unmarshal将查看目标结构的字段以查找(按优先顺序):

标记为“Foo”的导出字段(有关结构标记的更多信息,请参阅Go规范),

一个名为“Foo”的导出字段,或

一个名为“FOO”或“FoO”的导出字段或“Foo”的其他一些不区分大小写的匹配项。

所以你的结构应该是:

type Packagemeta struct {
    Path     string `json:"path"`
    Synopsis string `json:"synopsis,omitempty"`
    Count    int    `json:"import_count,omitempty`
}
© www.soinside.com 2019 - 2024. All rights reserved.