json - 使用反射迭代 json

标签 json go reflect

我正在尝试在我的 golang 项目中使用休息端点。 JSON 结构非常大并且是半结构化的,所以我使用反射来迭代它并获取我感兴趣的信息。

这是我解码响应的方式:

    var m map[string]interface{}
    json.Unmarshal(bytes, &m)

但我坚持的部分是 - 我正在遍历一片 map (我认为),但我无法获得 map 的键或值。这是有问题的代码。

    if val, ok := m["messages"]; ok {
        s := reflect.ValueOf(val)

        if s.Kind() == reflect.Slice {
            for i := 0; i < s.Len(); i++ {
                item := s.Index(i)

                fmt.Println("VALUE = ", item.Elem())
                fmt.Println("KIND = ", item.Kind())
            }
        }
        return
    }

当我运行代码时,显示的值看起来像一张 map :
map[decoration_stats:<nil> highlight_ranges:map[] index:graylog_7 message:map[_id:49272694-1834-11ea-8928-0242ac120004 docker:{"container_id":"0f9d97722c25240c6f99487b247b2416177a749de47d661cd661334514e0e74f"} facility:fluentd gl2_message_id:01DVDSM9VSDQ5PF81T4C31NSH6....

种类是:
KIND =  interface

我尝试了各种方法,例如:
        for _, e := range val.MapKeys() {
            v := val.MapIndex(e)
            fmt.Println(v)
        }

但代码 panic :
panic: reflect: call of reflect.Value.MapKeys on interface Value

抱歉,我对 golang 有点陌生,但在涉及任何反射类型编程时,我使用过其他静态类型语言,主要是 Java。

我的问题是如何将此接口(interface)转换为 map 或某种具体类型,以便我可以使用它。任何帮助将不胜感激。

最佳答案

使用反射是一种低效的方法。 JSON unmarshal,当与接口(interface)(和 map[string]interface{})一起使用时会产生一组有限的类型,您可以使用类型断言或类型开关来处理它:

if val, ok := m["messages"]; ok {
   switch v:=val.(type) {
      case map[string]interface{}: // JSON object
        for key, value:=range v {
        }
      case []interface{}: // JSON array
        for i,node:=range v {
        }
      case string: // string value
      case float64: // numeric value
      case bool: // boolean value
      case json.Number: // If you use json.Decoder with UseNumber()
   }
}

关于json - 使用反射迭代 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59215153/

相关文章:

arrays - 实现Scan接口(interface)将json数组读入map

go - 如何确定接口(interface) slice 中的值类型{}

go - 使用原子而不是线程是线程安全的吗?

go - 如何在 go 程序中将字符串评估为 go 代码?

pointers - 反射结构字段。使用标志指针值设置

go - 使用反射,如何将值设置为结构字段(指针)

php - Advanced Rest 客户端中的数据数组响应无效

c# - Newtonsoft.JSON 无法转换具有 TypeConverter 属性的模型

javascript - 创建使用 Underscore.js groupBy 和 map 计算的 knockout 以进行选择控制

json字符串解码遇到无效转义