我有一个包含大量数据的json文件:
{"elec":{
"s20":{
"coldS":{
"wDay": {
"Night": {"avg": 1234, "stddev": 56},
"Morning": {"avg": 5432, "stddev": 10}
...
},
...
},
...
},
...
}
我想将此文件作为go结构加载:
type ConsumConfig struct {
elec map[string]map[string]map[string]map[string]ConsumConfValue `json:"elec"`
gas map[string]map[string]map[string]map[string]ConsumConfValue `json:"gas"`
}
type ConsumConfValue struct {
avg int `json:"avg"`
stdev int `json:"stddev"`
}
当我解组文件数据时,我获取了struct类型的零值对象,而不是一个充满数据的对象(获取elec
= map[]
和gas
= {{ 1}})。因此,当我访问这些地图的值时,我获得了零值(所以map[]
因为有整数)。
没有编译或执行错误。我试图找出是否存在文件名问题或者我的文件是否包含零,但它不是;有文件(成功加载为字节数组),包含不同于0的值。
以下是解组文件的代码:
0
这是我做的测试,看看返回的对象中有什么东西:
func GetConsumConfig(climatFilePath string) ConsumConfig {
fileBytes, err := ioutil.ReadFile(climatFilePath) // get file as byte array
if err != nil {
panic(err)
}
var configConsum ConsumConfig
err = json.Unmarshal(fileBytes, &configConsum) // byte array as struct
if err != nil {
panic(err)
}
return configConsum
}
这就是打印:
fmt.Println("0...", climatFilePath)
for a, b := range returnedConfigConsum.elec {
fmt.Println(a, ": ", b)
}
fmt.Println("1...")
for a, b := range returnedConfigConsum.gas {
fmt.Println(a, ": ", b)
}
fmt.Println("2...")
而不是像
这样的东西0... file/path.json
1...
2...
答案 0 :(得分:2)
这是因为您的elec
和gas
字段是小写的。 json.Unmarshal
只会触及以大写字母开头的字段。将它们重命名为Elec
和Gas
应该可以解决问题。