2013-05-21 4 views
4

나는 Go에 websocket 클라이언트를 작성하고 있습니다.깊게 중첩 된 json 키와 값에 액세스하는 방법

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

내가 time 매개 변수를 액세스하기 위해 노력하고있어,하지만 단지 인터페이스 타입으로 깊이에 도달하는 방법을 파악할 수 없습니다 : 나는 서버에서 다음과 같은 JSON을 받고있어

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 {}) 
난 그냥 깊이 N 잡기 위해지도에 발굴 할 수있는 방법을 찾을 수 없습니다

ested 키와 값.

일단 동적 값을 가져 오면이 메시지를 선언하고 싶습니다. 어떻게 이러한 복잡한 데이터 구조체를 표현할 수있는 형식 구조체를 작성합니까?

+0

반환 된 JSON은 항상 같은 필드를 갖습니까? – Intermernet

+0

네, 기본적으로 같습니다. – ojosilva

+0

그러면 데이터와 일치하는 구조체를 정의하는 것과 관련하여 @ cthom06을 제안해야합니다. 장기간에 걸쳐 각 분야에 대해 어떤 유형을 얻고 있는지 알게 될 것이므로 훨씬 쉽게 할 수 있습니다. – Intermernet

답변

7

디코딩 한 map[string]interface{}의 부분은 해당 필드의 유형과 일치합니다. 그래서이 경우 : 당신은 JSON의 구조를 알고있는 경우

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

는, 그러나 "2013-05-21 16:56:16"

를 반환해야합니다, 당신은으로 그 구조와 비 정렬 화를 일치하는 구조체를 정의하는 시도해야합니다. 예 : 완벽하게되지 않을 수도 있습니다,하지만 아이디어를 당신에게 제공한다

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

그 덕분에, 고마워. 하지만 이것을 유형 struct로 바꾸고 데이터에 액세스하려면 어떻게해야합니까? – ojosilva

+0

@ojosilva는 거친 예제 코드를 추가했습니다. – cthom06

+0

구조체가 훌륭했습니다! 나는''json :''key "''string이 Go 타입 구조체의 구문에 어떻게 들어 맞는지 알지는 못했지만,''json.Unmarshall()'func은 각 키 - 값 쌍 . – ojosilva

관련 문제