如何在Go中json解码接口切片?

时间:2018-08-06 15:35:01

标签: go

我是json.Decode(),(将速记形式)从api转换为大结构的json响应。在该结构中,有几种类型为[] interface {}的类型。我不知道如何从那些特殊的嵌套结构中提取任何数据。我曾尝试使用案例切换类型检查解决方案,但仍然空手而归。有人可以分享他们在类似案件中的经验或向我指出正确的方向吗?

m := new(largestruct)
if err := json.NewDecoder(resp.Body).Decode(&m); err != nil{
return err
}

接口的struct字段为:

Strings []interface{} `json:"strings"`

1 个答案:

答案 0 :(得分:1)

使用切换包,您可以获取接口下的值。该函数将递归运行,直到获得解析的json的原始类型为止。

func fetchValue(value interface{}) { // pass the interface value from the struct in this function as it will run recursively to get the value.
    switch value.(type) {
    case string:
        fmt.Printf("%v is an string \n ", value.(string))
    case bool:
        fmt.Printf("%v is bool \n ", value.(bool))
    case float64:
        fmt.Printf("%v is float64 \n ", value.(float64))
    case []interface{}:
        fmt.Printf("%v is a slice of interface \n ", value)
        for _, v := range value.([]interface{}) {
            fetchValue(v)
        }
    case map[string]interface{}:
        fmt.Printf("%v is a map \n ", value)
        for _, v := range value.(map[string]interface{}) {
            fetchValue(v)
        }
    default:
        fmt.Printf("%v is unknown \n ", value)
    }
}

golang spec for unmarshal中定义了切换类型受限制的原因,其中明确描述了使用接口{}进行编组时json将解析为哪些值:

  

要将JSON解组为接口值,Unmarshal存储以下内容之一:   这些在界面值中:

bool, for JSON booleans
float64, for JSON numbers
string, for JSON strings
[]interface{}, for JSON arrays
map[string]interface{}, for JSON objects
nil for JSON null