2013-05-21 123 views
4

我正在寫一個websocket客戶端。我從服務器接收以下JSON:如何訪問深層嵌套的JSON鍵和值

{"args":[{"time":"2013-05-21 16:57:17"}],"name":"send:time"}

我試圖訪問time參數,但就是無法掌握如何深伸入接口類型:

package main; 
import "encoding/json" 
import "log" 
func main() { 
    msg := `{"args":[{"time":"2013-05-21 16:56:16", "tzs":[{"name":"GMT"}]}],"name":"send:time"}` 
    u := map[string]interface{}{} 
    err := json.Unmarshal([]byte(msg), &u) 
    if err != nil { 
     panic(err) 
    } 
    args := u["args"] 
    log.Println(args[0]["time"]) // invalid notation... 
} 

這明顯錯誤,因爲符號是不正確的:

invalid operation: args[0] (index of type interface {}) 

我無法找到一個方法來挖掘到地圖深刻ñ搶ested鍵和值。

一旦我可以克服抓住動態值,我想宣佈這些消息。我將如何編寫一個類型結構來表示這樣複雜的數據結構?

+0

返回的JSON是否總是具有相同的字段? – Intermernet

+0

是的,基本上是一樣的。 – ojosilva

+0

然後你應該真的去@ cthom06建議關於定義一個匹配數據的結構。從長遠來看,它會讓你更容易,因爲你會知道每個字段的類型。 – Intermernet

回答

7

您解碼成的map[string]interface{}interface{}部分將匹配該字段的類型。因此,在這種情況下:

args.([]interface{})[0].(map[string]interface{})["time"].(string) 

應該返回"2013-05-21 16:56:16"

但是,如果你知道了JSON的結構,你應該嘗試界定該結構與解組匹配成一個結構。例如:

type Time struct { 
    Time time.Time  `json:"time"` 
    Timezone []TZStruct `json:"tzs"` // obv. you need to define TZStruct as well 
    Name string   `json:"name"` 
} 

type TimeResponse struct { 
    Args []Time   `json:"args"` 
} 

var t TimeResponse 
json.Unmarshal(msg, &t) 

這也許不是完美的,但應該給你的想法

+0

工作,謝謝。但是,我怎麼會把它變成一個類型結構,然後訪問數據? – ojosilva

+0

@ojosilva增加了粗略的示例代碼 – cthom06

+0

該結構是輝煌的東西!我只是不明白'json:「key」'字符串如何適合Go類型結構的語法,儘管我明白它告訴'json.Unmarshall()'func在哪裏適合每個鍵值對。 – ojosilva