2017-08-17 37 views
-3

我有一個JSON文件,其中包含大量的數據:拆封JSON結構中去作空地圖

{"elec":{ 
    "s20":{ 
     "coldS":{ 
      "wDay": { 
       "Night": {"avg": 1234, "stddev": 56}, 
       "Morning": {"avg": 5432, "stddev": 10} 
       ... 
      }, 
      ... 
     }, 
     ... 
    }, 
    ... 
} 

我希望加載這個文件作爲中間人結構:

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因爲有整數)。

沒有編譯和執行錯誤。我試圖找出是否有文件名的問題,或者如果我的文件包含零,但它不是;有文件(即成功加載作爲一個字節數組),包含不同的值大於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... file/path.json 
s20: map[..] 
s50: map[..] 
s75: map[..] 
1... 
s20: map[..] 
s50: map[..] 
s75: map[..] 
2... 

回答

1

這是因爲你elecgas字段是小寫。 json.Unmarshal只會觸及以大寫字母開頭的字段。將它們重命名爲ElecGas應該可以解決該問題。

+0

噢好吧,我明白爲什麼-1在我的問題x)我不習慣那個較低/大寫更改程序如何工作...謝謝(我想我會很快刪除這個問題...);請注意,我也必須將'avg'和'stdev'更改爲'Avg'和'Stdev'(因爲小寫而難以使用) – NatNgs