>

golang을 처음 사용하고 중첩 된 JSON 응답을 읽는 동안 문제가 있습니다.

var d interface{}
json.NewDecoder(response.Body).Decode(&d)
test :=d["data"].(map[string]interface{})["type"]

response.Body  이것처럼 보입니다

{
    "links": {
      "self": "/domains/test.one"
    },
    "data": {
        "type": "domains",
        "id": "test.one",
        "attributes": {
            "product": " Website",
            "package": "Professional",
            "created_at": "2016-08-19T11:37:01Z"
        }
    }
}

내가 얻는 오류는 이것입니다 :

invalid operation: d["data"] (type interface {} does not support indexing)

  • 답변 # 1

    d   interface{} 유형입니다 이므로 d["data"] 처럼 색인을 생성 할 수 없습니다 , 다른 유형 주장이 필요합니다.

    test := d.(map[string]interface{})["data"].(map[string]interface{})["type"]
    fmt.Println(test)
    
    

    그럼 작동합니다. 출력은 "domains" 입니다. . Go Playground에서 실습 예제를 참조하십시오.

    또한 d 를 선언하면   map[string]interface{} 유형이어야 함 첫 번째 유형 어설 션을 절약 할 수 있습니다.

    var d map[string]interface{}
    if err := json.NewDecoder(response.Body).Decode(&d); err != nil {
        panic(err)
    }
    test := d["data"].(map[string]interface{})["type"]
    fmt.Println(test)
    
    

    출력은 동일합니다. Go Playground에서 사용해보십시오.

    이러한 작업을 여러 번 수행해야하는 경우 github.com/icza/dyno 를 찾을 수 있습니다.  라이브러리가 유용합니다 (동적 객체 작업을 돕는 것이 주요 목표입니다).

  • 답변 # 2

    상황을 처리하기 위해 몇 가지 트릭이 필요합니다. 리플렉션을 사용하는 것처럼 골랑 몽고 드라이버 mgo에서 bson.M에 대한 Marshall&&UnMarshall 코드를 참조 할 수 있습니다

    다음과 같이 중첩 된 리플 렉트 디코딩을 사용한 코드 샘플 :

    package main
    import (
        "encoding/json"
        "fmt"
        "reflect"
    )
    func main() {
        keys := []string{"hello", "world", "dude", "kind", "cool"}
        a := make(map[string]interface{})
        a[keys[4]] = "perfect"
        b := make(map[string]interface{})
        b[keys[3]] = a
        c := make(map[string]interface{})
        c[keys[2]] = b
        d := make(map[string]interface{})
        d[keys[1]] = c
        e := make(map[string]interface{})
        e[keys[0]] = d
        fmt.Println(e)
        if buf, err := json.Marshal(e); nil == err {
            dd := make(map[string]interface{})
            err = json.Unmarshal(buf, &dd)
            if nil != err {
                fmt.Println("failed", err)
            }
            for k, v := range dd {
                travel(dd, k, v)
            }
            fmt.Println(dd)
        } else {
            fmt.Println("failed marshal")
        }
    }
    func travel(dd map[string]interface{}, key string, value interface{}) {
        vv := reflect.ValueOf(value)
        switch vv.Kind() {
        case reflect.Map:
            m := value.(map[string]interface{})
            dd[key] = m
            for k, v := range m {
                travel(m, k, v)
            }
        case reflect.String:
            dd[key] = value.(string)
        }
    }
    
    

  • 이전 python - 요청 및 psycopg2를 사용하여 Postgres에서 Json 생성/삽입
  • 다음 javascript - div 태그에서 차례로 닫고 여는 방법