在go中解组JSON结构制作空地图

时间:2017-08-17 12:21:03

标签: json dictionary go unmarshalling

我有一个包含大量数据的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...

1 个答案:

答案 0 :(得分:2)

这是因为您的elecgas字段是小写的。 json.Unmarshal只会触及以大写字母开头的字段。将它们重命名为ElecGas应该可以解决问题。