【发布时间】:2020-04-29 17:27:47
【问题描述】:
我的目标是读取 JSON 文件。尽管以下程序可以正常读取文件,但 id 字段值不正确。对于所有读取的对象,id 字段值为 0。
示例 JSON 文件内容:
{
"users" : [
{
"id" : "1",
"name" : "Matt Hayden"
},
{
"id" : "2",
"name" : "David Warner"
},
]
}
Golang 中的 JSON 文件阅读器程序
type Schema struct {
Id int `json:"id"`
Name string `json:"name"`
}
func reader() {
fileName := "./input.json"
jsonFile, fileErr := os.Open(fileName)
if fileErr != nil {
_ = errors.Errorf("failed to open file %s : %v", fileName, fileErr)
}
defer jsonFile.Close()
bytesRead, readErr := ioutil.ReadAll(jsonFile)
if readErr != nil {
_ = errors.Errorf("failed to read json file %s : %v", fileName, readErr)
}
var sch Schema
unMarshalErr := json.Unmarshal(bytesRead, &sch)
if unMarshalErr != nil {
_ = errors.Errorf("failed to unmarshal JSON bytes : %v", unMarshalErr)
}
fmt.Printf("%+v", sch)
}
实际输出:
{Users:[{Id:0 Name:Matt Hayden} {Id:0 Name:David Warner}]}
预期输出:
{Users:[{Id:1 Name:Matt Hayden} {Id:2 Name:David Warner}]}
【问题讨论】:
-
我不知道去,但 JSON 中的数字没有字符串文字 - 这可能是你的错误。
-
就是这样。也是马特·海登 ;)
-
还要确保键名一致:
id != Id -
@JoshSharkey 没有必要——在 Go 中,对于 JSON 和它们编组的结构有不同的情况是正常的。该字段旁边的注释告诉 Go 如何编组/解组 JSON。
-
除了 JSON very much 区分大小写,所以如果 Go 自动将
Id解析为id,那真的很糟糕,人们会特别期待对于 JSON 解析,这种分辨率不会起作用,因为如果这样做会很荒谬。a = { id: 3, Id: 4 }既是有效的 JS,又是有效的 JSON{"id": 4, "Id": 5}。