Json 如何强制接口对象执行一些索引操作?

Json 如何强制接口对象执行一些索引操作?,json,go,Json,Go,我得到的日志数据源如下所示: {“LogtypeA”:{“content”:“listen_logs”:[{“usiver_key1:val1”,“usiver_key2:val2},{“usiver_key1:val1}]} 然后我使用simplejson来解析它们。listen_日志的值是至少包含一个映射的切片。 代码是: for _, v := range js.Get("LogTypeA").Get("content").Get("listen_logs").MustArray() {

我得到的日志数据源如下所示:

{“LogtypeA”:{“content”:“listen_logs”:[{“usiver_key1:val1”,“usiver_key2:val2},{“usiver_key1:val1}]}

然后我使用simplejson来解析它们。listen_日志的值是至少包含一个映射的切片。 代码是:

for _, v := range js.Get("LogTypeA").Get("content").Get("listen_logs").MustArray() {
        _obj := reflect.ValueOf(v)
        fmt.Println(_obj.Kind())
    }
如果我将
MustArray()
替换为
Array()
,它将报告错误的变量和常量声明。 使用reflect模块,我会发现
\u obj.Kind()
是映射,但我不能使用任何索引方法从
v
获取值,例如:

_val1 := v["useful_key1"]

因为类型
接口{}
不支持索引。
那么,我应该如何从这些日志中提取这些有用的keyX呢?

您需要在生成的映射上执行类型断言:

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.")
}

由于它最初是一个空接口,即
接口{}
,这意味着它可以是任何类型。因此,在尝试访问项目之前,您需要指定要将其视为映射。

此处未提及的库请阅读或阅读整个章节。从技术上讲,这是类型断言,而不是强制转换,因为您获得的是接口的实际基础类型的值,而不是更改类型。
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.")
}