2015-06-16 68 views
0

我很難搞清楚如何將JSON文件的「小節」加載到地圖元素中。背景:我想解組一個有些複雜的配置文件,它具有嚴格的結構,所以我認爲最好是解組成一個「靜態」結構而不是一個接口。解組成JSON到地圖中去

這裏例如一個簡單的JSON文件:

{ 
    "set1": { 
     "a":"11", 
     "b":"22", 
     "c":"33" 
    } 
} 

此代碼:

package main 

import (
    "encoding/json" 
    "fmt" 
    "io/ioutil" 
    "os" 
) 

type JSONType struct { 
    FirstSet ValsType `json:"set1"` 
} 

type ValsType struct { 
    A string `json:"a"` 
    B string `json:"b"` 
    C string `json:"c"` 
} 

func main() { 
    file, e := ioutil.ReadFile("./test1.json") 
    if e != nil { 
     fmt.Println("file error") 
     os.Exit(1) 
    } 
    var s JSONType 
    json.Unmarshal([]byte(file), &s) 
    fmt.Printf("\nJSON: %+v\n", s) 
} 

但這並不:

package main 

import (
    "encoding/json" 
    "fmt" 
    "io/ioutil" 
    "os" 
) 

type JSONType struct { 
    FirstSet ValsType `json:"set1"` 
} 

type ValsType struct { 
    Vals map[string]string 
} 

func main() { 
    file, e := ioutil.ReadFile("./test1.json") 
    if e != nil { 
     fmt.Println("file error") 
     os.Exit(1) 
    } 

    var s JSONType 
    s.FirstSet.Vals = map[string]string{} 
    json.Unmarshal([]byte(file), &s) 
    fmt.Printf("\nJSON: %+v\n", s) 
} 

的瓦爾斯地圖不是裝。我究竟做錯了什麼?謝謝你的幫助!

這裏有一個更好的例子:

{ 
    "set1": { 
     "a": { 
      "x": "11", 
      "y": "22", 
      "z": "33" 
     }, 
     "b": { 
      "x": "211", 
      "y": "222", 
      "z": "233" 
     }, 
     "c": { 
      "x": "311", 
      "y": "322", 
      "z": "333" 
     }, 
    } 
} 

代碼:

package main 

import (
    "encoding/json" 
    "fmt" 
    "io/ioutil" 
    "os" 
) 

type JSONType struct { 
    FirstSet map[string]ValsType `json:"set1"` 
} 

type ValsType struct { 
    X string `json:"x"` 
    Y string `json:"y"` 
    Z string `json:"z"` 
} 

func main() { 
    file, e := ioutil.ReadFile("./test1.json") 
    if e != nil { 
     fmt.Println("file error") 
     os.Exit(1) 
    } 
    var s JSONType 
    json.Unmarshal([]byte(file), &s) 
    fmt.Printf("\nJSON: %+v\n", s) 
} 

回答

3

我相信那是因爲你有你的模型間接的額外層。

type JSONType struct { 
    FirstSet map[string]string `json:"set1"` 
} 

應該足夠了。如果您指定map[string]string,則json中的對象將被識別爲該映射。你創建了一個結構來包裝它,但是像這樣的一個json塊;

{ 
    "a":"11", 
    "b":"22", 
    "c":"33" 
} 

其實可以直接解組爲map[string]string

編輯:基於註釋

type JSONType struct { 
    FirstSet map[string]Point `json:"set1"` 
} 

type Point struct { 
    X string `json:"x"` 
    Y string `json:"y"` 
    Z string `json:"z"` 
} 

這使你的3 d點是靜態類型結構這是很好的一些其他車型。如果你想做快速和骯髒,你也可以使用map[string]map[string]string 這將給出地圖的地圖,所以你可以訪問像FirstSet["a"]["x"]這樣的點值,它會返回"11"

二編輯;顯然我沒有仔細閱讀過你的代碼,因爲上面的例子是一樣的。基於此,我猜你想要

FirstSet map[string]map[string]string `json:"set1"` 

選項。雖然編輯完成後我還不完全清楚。

+0

感謝您的快速回復。這完全有道理......不幸的是我簡化了我的例子。的數據是更以下形式:'{ 「SET1」:{ 「一」:{ \t 「×」: 「11」 時, \t 「Y」: 「22」, \t 「Z」:「33 「 \t}, 」b「:{ \t 」×「: 」211「, \t 」Y「: 」222「, \t 」Z「: 」233「 \t}, 」C「:{ \t「x」:「311」, \t「y」:「322」, \t「z」:「333」 \t}, } }',我想創建一個結構圖 - 即map [string] StuctXType。 –

+0

@JamesHaskell很酷,我爲你編輯了更多關於模型的文章:D – evanmcdonnal

+0

再次感謝 - 我真的很感謝你的幫助。上面列出的路徑是我從昨天開始一直在嘗試的,但它不適用於我......不知道爲什麼,如果我有我錯過了或錯過了一個錯字。我將我的修改過的代碼發佈爲我的原始編輯...我得到的結果是:'JSON:{FirstSet:map []}'。任何額外的想法?或者你能爲我發佈一個完整的工作示例嗎?非常感謝。我很開心學習去... –