讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在 Go 中递归遍历任意嵌套的 JSON 数据(无需预定义结构)

千墨大大_3911

千墨大大_3911

发布时间:2026-02-03 22:34:02

|

646人浏览过

|

来源于php中文网

原创

如何在 Go 中递归遍历任意嵌套的 JSON 数据(无需预定义结构)

本文介绍使用 `map[string]interface{}` 和递归类型断言,高效遍历动态、多层嵌套的 json 数据,自动识别并处理对象(map)、数组(slice)和基础值,适用于无法提前定义 struct 的场景。

在 Go 中处理未知结构的 JSON(即“任意嵌套 JSON”)时,最常用且推荐的方式是将 JSON 解码为 map[string]interface{}(对应 JSON 对象)和 []interface{}(对应 JSON 数组)。由于 Go 是静态类型语言,interface{} 本身不携带运行时类型信息,因此必须通过类型断言(type assertion) 或 类型开关(type switch) 显式判断实际类型,才能安全访问其内容。

下面是一个完整、可直接运行的递归解析方案:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    var m map[string]interface{}
    if err := json.Unmarshal([]byte(input), &m); err != nil {
        panic(err)
    }
    parseMap(m)
}

// parseMap 递归遍历 JSON 对象(map[string]interface{})
func parseMap(m map[string]interface{}) {
    for key, val := range m {
        switch v := val.(type) {
        case map[string]interface{}:
            fmt.Printf("→ Object: %s\n", key)
            parseMap(v) // 递归进入下一层对象
        case []interface{}:
            fmt.Printf("→ Array: %s\n", key)
            parseArray(v) // 递归进入数组元素
        default:
            // 基础类型:string, number (float64), bool, nil
            fmt.Printf("  %s: %v (type: %T)\n", key, v, v)
        }
    }
}

// parseArray 递归遍历 JSON 数组([]interface{})
func parseArray(a []interface{}) {
    for i, val := range a {
        switch v := val.(case) {
        case map[string]interface{}:
            fmt.Printf("  [Index %d] → Object\n", i)
            parseMap(v)
        case []interface{}:
            fmt.Printf("  [Index %d] → Array\n", i)
            parseArray(v)
        default:
            fmt.Printf("  [Index %d]: %v (type: %T)\n", i, v, v)
        }
    }
}

const input = `
{
  "outterJSON": {
    "innerJSON1": {
      "value1": 10,
      "value2": 22,
      "InnerInnerArray": ["test1", "test2"],
      "InnerInnerJSONArray": [{"fld1": "val1"}, {"fld2": "val2"}]
    },
    "InnerJSON2": "NoneValue"
  }
}`

✅ 关键要点说明:

chartjs-reporter
chartjs-reporter

此技能用于在用户需要将结构化数据(查询结果、CSV 摘要、JSON 记录或 Python 字典/列表)转换为独立的 HTML 页面时使用。

下载
  • 类型安全是前提:interface{} 必须用 val.(type) 类型开关或 val.(map[string]interface{}) 断言明确转换,否则编译失败或 panic;
  • 递归终止条件自然存在:当遇到 string/float64/bool/nil 等非复合类型时,递归停止,直接输出;
  • 数组索引清晰可见:parseArray 显式打印 Index N,便于定位元素位置(例如 "fld1" 位于 InnerInnerJSONArray[0]);
  • 类型保留准确:fmt.Printf("%T", v) 可确认数字默认为 float64(JSON 规范无 int/float 区分),如需整数可做 int(v.(float64)) 转换(注意精度与边界检查);
  • 性能足够高效:无反射滥用,仅用原生类型判断,适合中等规模 JSON(GB 级建议改用 json.Decoder 流式解析)。

⚠️ 注意事项:

  • 若 JSON 中含 null,对应值为 nil(v == nil),需单独处理;
  • 不支持 JSON 中的 number 溢出或超长小数(Go float64 精度限制);
  • 如需提取所有 fld1 字段值,可在 parseMap 中增加匹配逻辑(例如 if key == "fld1" { fmt.Println("Found fld1 =", v) }),无需修改主干结构。

该方案是 Go 处理动态 JSON 的标准实践,简洁、健壮、易于扩展,特别适合配置解析、日志分析、API 响应泛化处理等场景。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

519

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

596

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1156

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

771

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1706

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

4814

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

2214

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

4086

2025.06.17

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 21.1万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn