You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言如何遍历无预定义结构的嵌套interface{}切片

处理未知结构的嵌套JSON遍历问题

嘿,问题出在你已经通过switch确认了当前元素是[]interface{}类型,结果后面又硬把它转成map[string]interface{},这当然会报错啦!要处理未知结构的嵌套JSON,你需要用递归来遍历所有层级的元素——因为JSON的嵌套可能是多层的,既有对象(对应Go里的map[string]interface{})也有数组(对应[]interface{}),单一的循环根本覆盖不了所有情况。

修正后的递归遍历实现

我给你写一个通用的遍历函数,能处理JSON解析后可能出现的所有类型:

import "fmt"

func traverseJSON(v interface{}) {
    switch val := v.(type) {
    // 处理JSON对象(对应Go的map)
    case map[string]interface{}:
        fmt.Printf("发现一个JSON对象:\n")
        for key, value := range val {
            fmt.Printf("  键: %s, 值类型: %T\n", key, value)
            traverseJSON(value) // 递归处理嵌套的对象或数组
        }
    // 处理JSON数组(对应Go的切片)
    case []interface{}:
        fmt.Printf("发现一个JSON数组,包含%d个元素:\n", len(val))
        for idx, item := range val {
            fmt.Printf("  索引: %d, 元素类型: %T\n", idx, item)
            traverseJSON(item) // 递归处理数组中的每个元素
        }
    // 处理基础类型
    case string:
        fmt.Printf("发现字符串: %q\n", val)
    case float64:
        fmt.Printf("发现数字: %.2f\n", val)
    case bool:
        fmt.Printf("发现布尔值: %t\n", val)
    case nil:
        fmt.Println("发现空值(null)")
    // 处理其他未知类型
    default:
        fmt.Printf("未知类型: %T, 值: %v\n", val, val)
    }
}

如何使用这个函数

在你原来的代码里,解析完JSON之后直接调用这个函数就行:

output := make(map[string]interface{})
err = json.Unmarshal(body, &output)
if err != nil {
    fmt.Println(err)
    return err
}
traverseJSON(output) // 调用递归遍历函数
return err

关键说明

  1. 递归的必要性:JSON结构可能是多层嵌套的(比如数组里包含对象,对象里又包含数组),只有递归才能深入每一层处理所有元素。
  2. 类型断言的正确使用:在switch分支里,我们已经通过val := v.(type)拿到了对应类型的值,不需要再重复做类型断言(像你原来代码里的b.(map[string]interface{})就是错误的,因为此时b已经是切片类型了)。
  3. 覆盖所有JSON类型:JSON的基础类型对应Go里的string、float64、bool和nil,我们的switch分支都覆盖到了,避免遗漏。

如果之后你需要对特定数据做提取或修改,只需要在对应的case分支里加入逻辑即可——比如在处理map的时候判断key是否是你需要的,或者在处理数组的时候筛选特定类型的元素。

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:24:47