我是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"`
答案 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