我在迭代包含接口切片的接口切片时遇到问题。
此问题是在尝试使用返回 JSON 数据的 API 调用时出现的。返回的数据相当多,并且结构根据请求的不同而有很大差异。 API 文档中也没有 JSON 响应的结构,因此我尝试实现一些处理任意 JSON 响应的方法。
目前,当进行初始调用时,它被放入 map[string]interface{} 中,然后运行 switch 语句来确定每个元素的类型,当遇到接口切片时就会出现问题。我似乎对他们无能为力。
我尝试过使用 sort 包几次(特别是 sort 和 slicestable 函数),但没有成功。
我收到的错误是:
interface conversion: interface {} is []interface {}, not map[string]interface {}
当我尝试映射接口切片以便我可以再次使用 switch 语句迭代它们时,就会发生这种情况。
output := make(map[string]interface{})
err = json.Unmarshal(body, &output)
fmt.Println(err)
identify(output)
return err
}
func identify(output map[string]interface{}) {
fmt.Printf("%T", output)
for a, b := range output {
switch bb := b.(type) {
case string:
fmt.Println("This is a string")
case float64:
fmt.Println("this is a float")
case []interface{}:
fmt.Println(" is []interface ", bb)
test := b.(map[string]interface{}) // falis here
fmt.Println("Success!", test)
default:
return
}
}
}
因此,基本问题是如何在事先不知道结构的情况下迭代嵌套的接口切片?
好吧,你不能投射[]interface{}
to map[string]interface{}
。由于它是一个切片,因此您可以迭代它的元素(请注意bb
is b
已经转换为适当的类型,您不需要转换b
again):
case []interface{}:
fmt.Println(" is []interface ", bb)
for _, val := range bb {
// do something with val
}
default:
...
为什么你必须面对一些你不知道的事情?您是否有可能重新考虑您的架构并使用已知类型?
你看到了吗使用延迟解组的示例json.RawMessage?或者也许尝试一下实现 Unmarshaler 接口?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)