英文:
Unmarshaling JSON structure in go make empty maps
问题
我有一个包含大量数据的 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"`
}
当我对文件数据进行解组时,我得到了一个零值对象而不是一个包含数据的对象(得到 elec
= map[]
和 gas
= map[]
)。所以当我访问这些映射的值时,我得到的是零值(即 0
,因为它们是整数)。
没有编译或执行错误。我尝试查找是否存在文件名问题或者我的文件是否包含零值,但事实并非如此;文件存在(成功加载为字节数组),其中包含与零不同的值。
这是我用于解组文件的代码:
func GetConsumConfig(climatFilePath string) ConsumConfig {
fileBytes, err := ioutil.ReadFile(climatFilePath) // 将文件读取为字节数组
if err != nil {
panic(err)
}
var configConsum ConsumConfig
err = json.Unmarshal(fileBytes, &configConsum) // 将字节数组解组为结构体
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... file/path.json
s20: map[..]
s50: map[..]
s75: map[..]
1...
s20: map[..]
s50: map[..]
s75: map[..]
2...
英文:
I have a json file, containing plenty of data:
{"elec":{
"s20":{
"coldS":{
"wDay": {
"Night": {"avg": 1234, "stddev": 56},
"Morning": {"avg": 5432, "stddev": 10}
...
},
...
},
...
},
...
}
I want to load this file as a go structure:
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"`
}
When I do unmarshaling file data, I obtain an zero-value object of my struct type instead of an object full of data (obtaining elec
= map[]
and gas
= map[]
). So when I access to the value of theses map, I obtain zero-values (so 0
cause there are integers).
There is no compilation nor execution errors. I try to find if there was a problem of filename or if my file containing zeros, but it's not; there is the file (that is successfully loaded as a byte array), containing values different than 0.
Here is my code to unmarshal the file:
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
}
And here is the test I do to view that there is anything inside the returned object:
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...")
And this is printing just that:
0... file/path.json
1...
2...
Instead of something like
0... file/path.json
s20: map[..]
s50: map[..]
s75: map[..]
1...
s20: map[..]
s50: map[..]
s75: map[..]
2...
答案1
得分: 2
这是因为你的 elec
和 gas
字段是小写的。json.Unmarshal
只会处理以大写字母开头的字段。将它们重命名为 Elec
和 Gas
可能会解决这个问题。
英文:
This is because your elec
and gas
fields are lowercase. json.Unmarshal
will only touch the fields starting with an uppercase. Renaming them to Elec
and Gas
should probably fix the issue.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论