2013-06-12 93 views
8

訪問地圖數據所以我有JSON的下面一點,我想拉出下的「令牌」的「$ T」的價值。繼續執行代碼...golang:內迅速地圖

{ 
    "@encoding": "iso-8859-1", 
    "@version": "1.0", 
    "service": { 
    "auth": { 
     "expiresString": { 
     "$t": "2013-06-12T01:15:28Z" 
     }, 
     "token": { 
     "$t": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 
     }, 
     "expires": { 
     "$t": "1370999728" 
     }, 
     "key": { 
     "$t": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 
     } 
    } 
} 

我有下面的代碼片段,將json解組成一個接口。然後我按照「標記」的「$ t」值工作。這種方法確實有效,但它很醜陋。

我的問題:有沒有比通過將每個地圖轉換爲接口更快的方式來訪問該值?我對Go非常陌生,並沒有意識到接口和地圖的許多有用功能。

var f interface{} 
jerr := json.Unmarshal(body, &f) 
m := f.(map[string]interface{}) 
ser := m["service"].(map[string]interface{}) 
a := ser["auth"].(map[string]interface{}) 
tok := a["token"].(map[string]interface{}) 
token := tok["$t"] 
fmt.Fprintf(w, "Token: %v\n", token) 

在此先感謝!

回答

11

如果這是你想要的唯一價值,那麼怎麼樣使用匿名struct定義路徑到您的數據。

var m = new(struct{Service struct{Auth struct{Token map[string]string}}}) 

var err = json.Unmarshal([]byte(data), &m) 

fmt.Println(m.Service.Auth.Token["$t"], err) 

DEMO:http://play.golang.org/p/ZdKTzM5i57


代替爲最裏面的數據map,我們可以使用另一種結構,但我們需要提供一個字段標籤別名的名稱。

var m = new(struct{Service struct{Auth struct{Token struct{T string `json:"$t"`}}}}) 

var err = json.Unmarshal([]byte(data), &m) 

fmt.Println(m.Service.Auth.Token.T, err) 

DEMO:http://play.golang.org/p/NQTpaUvanx

+0

很不錯。感謝包含這兩個版本。 – turnerd18

+0

不客氣。 –