这个问题在这里已有答案:
我想做什么 我正在解析基于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
我想要的是:
P.S:我知道之前已经问过这个问题并且有可能的解决方案,但它们都不适用于我。因此,我发了这篇文章。
您需要导出结构字段,否则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`
}