2017-07-25 60 views
0

如何將每個元素映射到結構或映射。基於具有不同類型的json數據。Go lang json解碼映射

{ 
    profile: { 
    execution_time: 34, 
    server_name: "myServer.net" 
    }, 
    result: "ok", 
    ret: [ 
    { 
     alias: "asda444444", 
     all_parents: [ 
     123, 
     2433369, 
     243628, 
     2432267, 
     62 
     ], 
     bankrupt: false, 
     block: false, 
     card: null 
    } 
    ] 
} 

我已經試過了。但不能按預期工作。

var o map[string]interface{} 
err := json.Unmarshal(data, &o) 
if err != nil { 
     revel.INFO.Println("Json Decode Error", err) 
    } 
fmt.Println(o) 

通過這種方式,我只能得到o [「ret」]。我真正想要的是o [「ret」] [「別名」]或o [「ret」] [「all_parents」]。

任何建議或提示將有所幫助。謝謝。

回答

2

您可以使用map[string]interface{}結果和類型轉換的相關部分,例如:

o["ret"].([]interface{}) 

會得到陣列,並繼續等。但是,這是乏味的,你需要檢查設置的值等。

相反,我建議您使用便捷的JSON to Go tool,它可以自動生成一個結構定義,以便在給定某些輸入JSON時粘貼到您的Go代碼中。

很明顯,您可能需要修改此以適應您的需求,因爲您知道輸入可以採用哪些有效格式。不過,這個工具節省了很多繁瑣的樣板代碼編寫!

例如,對於上面的JSON,它產生:

type AutoGenerated struct { 
    Profile struct { 
     ExecutionTime int `json:"execution_time"` 
     ServerName string `json:"server_name"` 
    } `json:"profile"` 
    Result string `json:"result"` 
    Ret []struct { 
     Alias string `json:"alias"` 
     AllParents []int `json:"all_parents"` 
     Bankrupt bool `json:"bankrupt"` 
     Block bool `json:"block"` 
     Card interface{} `json:"card"` 
    } `json:"ret"` 
} 
+0

[JSON來轉到工具(https://mholt.github.io/json-to-go/)似乎是一個簡單的方法來獲取json數據的結構。感謝您的分享。 – Weiwei