2013-05-21 2 views
4

Я пишу клиент websocket в Go. Я получаю следующий 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 {}) 

Я просто не могу найти способ, чтобы вырыть в карту, чтобы захватить глубоко н эстадными ключами и значениями.

Как только я смогу перехватить динамические значения, я бы хотел объявить эти сообщения. Как написать структуру типов для представления таких сложных структур данных?

+0

Будет ли возвращенный JSON иметь одинаковые поля? – Intermernet

+0

Да, в основном то же самое. – ojosilva

+0

Тогда вы должны действительно пойти с @ cthom06, чтобы определить структуру, которая соответствует данным. В конечном итоге это будет намного проще, так как вы будете знать, какой тип вы получаете для каждого поля. – Intermernet

ответ

7

interface{} часть map[string]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

8

Вы можете, как рассмотреть пакет github.com/bitly/go-simplejson

Смотрите документ: http://godoc.org/github.com/bitly/go-simplejson

Пример:

time, err := json.Get("args").GetIndex(0).String("time") 
if err != nil { 
    panic(err) 
} 
log.Println(time) 
+0

Wow, real nice. Просто хочу, чтобы у меня было что-то такое же простое, что и для работы с YAML, хотя цыганка выглядит многообещающей. – ojosilva

Смежные вопросы