我的日志数据源看起来像:
{ “LogtypeA”:{ “内容”: “listen_logs”:[{ “useful_key1”:VAL1, “useful_key2”:val2的},{ “useful_key1”:VAL1}]}}
然后我使用simplejson来解析它们。 listen_logs 的值是包含至少一个地图的切片。 代码是:
for _, v := range js.Get("LogTypeA").Get("content").Get("listen_logs").MustArray() {
_obj := reflect.ValueOf(v)
fmt.Println(_obj.Kind())
}
如果我用MustArray()
替换Array()
,它将报告不正确的变量和常量声明。
使用反射模块我会发现_obj.Kind()
是地图,但我无法使用任何索引方法从v
获取值,例如:
_val1 := v["useful_key1"]
或
for i, v := range v {...}
因为类型interface{}
不支持索引。
那么我应该如何从这些日志中提取那些有用的keyX ?
答案 0 :(得分:1)
您需要在结果地图上执行类型断言:
new_v := v.(map[string]interface{})
_val1 := new_v["useful_key1"]
或者,如果您不确定它是否为地图:
new_v, ok := v.(map[string]interface{})
if ok {
// it was a map from strings to something
_val1 := new_v["useful_key1"]
} else {
print("Could not interpret v as a map.")
}
由于它最初是一个空接口,即interface{}
,这意味着它可以是任何类型。因此,您需要指定在尝试访问项目之前将其视为地图。