gjson:Go 解析 JSON 的“瑞士军刀“,一行代码搞定嵌套地狱!

简介: gjson 是 Go 语言轻量 JSON 解析库,无需定义结构体或类型断言,支持点语法(如 `"user.name"`)、数组遍历(`"tags.0"`)、条件查询(`"users.#(age>25).name"`)及链式修饰(`|@reverse|@tostr`),性能优异、零内存分配,让嵌套 JSON 解析简洁高效。

🎭 故事开场:深夜加班,小明盯着屏幕上的嵌套 JSON 发呆:data.user.profile.settings.theme... 写结构体?太麻烦!用 map[string]interface{}?类型断言写到崩溃!直到他遇见了 gjson——"原来解析 JSON 可以这么优雅!"


✨ gjson 是什么?

一句话:不用定义结构体,不用层层断言,一行代码提取任意嵌套的 JSON 值

go get -u github.com/tidwall/gjson

🎯 核心用法:点语法,像查字典一样简单

import "github.com/tidwall/gjson"

const json = `{"user":{"name":"小红","age":18},"tags":["Go","Rust"]}`

// 取值?就这么简单!
name := gjson.Get(json, "user.name").String()   // "小红"
age := gjson.Get(json, "user.age").Int()        // 18
firstTag := gjson.Get(json, "tags.0").String()  // "Go"

💡 路径语法速查

  • . 访问嵌套字段:user.name
  • # 数组长度或遍历:tags.# → 2
  • * / ? 通配符:user.n?me → 匹配 name
  • #(...) 条件查询:friends.#(age>20).name

🔥 实战场景:3 个让你"哇塞"的例子

🎁 场景1:批量提取数组字段

// JSON: {"users":[{"name":"A"},{"name":"B"}]}
names := gjson.Get(json, "users.#.name").Array()
for _, n := range names {
   
    println(n.String())  // 输出: A, B
}

🎯 场景2:条件过滤,精准打击

// 找第一个年龄>25且姓氏为"张"的用户
result := gjson.Get(json, `users.#(age>25)#(last=="张").first`)
if result.Exists() {
   
    println("找到啦:", result.String())
}

⚡ 场景3:链式修饰,花式处理

// 反转数组 + 取第一个 + 转大写
val := gjson.Get(json, "tags|@reverse|0|@tostr")
// 原: ["Go","Rust"] → 反转: ["Rust","Go"] → 取0: "Rust" → 转字符串

💡 我的使用心得(避坑指南)

  1. 性能怪兽:基准测试显示 gjson.Get 约 200ns/次,零内存分配,高并发场景放心用
  2. 别忘校验:外部传入的 JSON 先用 gjson.Valid(json) 检查,避免意外
  3. Bytes 优先:处理 []byte 时用 GetBytes,避免不必要的 string 转换
  4. 存在性判断result.Exists()result.String() != "" 更可靠(空字符串也是合法值!)
// ✅ 推荐写法
if val := gjson.Get(json, "optional.field"); val.Exists() {
   
    process(val.String())
}

🎁 彩蛋:自定义 Modifier,解锁隐藏技能

// 添加一个 "upper" 修饰符,把结果转大写
gjson.AddModifier("upper", func(json, arg string) string {
   
    return strings.ToUpper(json)
})

// 使用:把用户名转大写
name := gjson.Get(json, "user.name|@upper").String()  // "小红" → "小红" (中文无影响,英文爽翻)

相关文章
|
1天前
|
安全 编译器 C语言
变参模板的前世今生——从va_list到参数包的演进
C++对可变数量参数的支持经历了漫长的演进。从C语言的va_list宏,到C++11的变参模板,再到C++17的折叠表达式,每一次进步都提升了类型安全性和表达能力。
35 7
|
1天前
|
人工智能 自然语言处理 JavaScript
OpenClaw 一键安装部署教程 告别复杂环境配置(包含最新安装包)
OpenClaw v2.6.0 一键部署工具,专为 Windows 10/11 64位设计。全程可视化操作,免命令行、免手动配环境,内置所有依赖,5分钟极速安装。需关闭杀软,路径须纯英文。部署即用,支持自然语言操控电脑,开启AI自动化办公。(239字)
|
1天前
|
人工智能 安全 机器人
阿里云3分钟部署OpenClaw、配置百炼Coding Plan、集成Slack步骤流程
阿里云轻量应用服务器一键部署OpenClaw,配合Slack接入与阿里云百炼免费大模型API配置,可快速搭建稳定、高效、安全的AI助手环境。遵循本文步骤,零基础用户可在30分钟内完成从部署到使用的全流程,无需复杂配置,所有命令可直接复制执行。通过本地与云端模型的灵活切换,兼顾成本、隐私与性能,满足日常任务与复杂场景的多样化需求。
56 6
|
1天前
|
SQL 人工智能 运维
公众号-4/7活动预告
4月11日北京,OpenClaw「企业实战专场」重磅来袭!告别玩具标签,龙虾进化出铁钳:支持TB级自进化记忆、VM级安全隔离、专家级业务理解。现场技能闪电秀+擂台赛,直击运维巡检、SSO接入、Vibe Coding等真实生产痛点。80席限量预约,共探AI Agent如何成为企业智能中枢。
36 3
|
1天前
|
人工智能 程序员 测试技术
智谱GLM-5.1发布:国产大模型长程任务能力显著提升,生产力工具迎来新突破
智谱发布GLM-5.1:全球首个支持8小时自主工作的开源大模型,显著提升代码与长程任务能力,在SWE-Bench Pro等测试中超越Claude Opus 4.6,推动AI从“对话工具”迈向“工程级助手”。
|
1天前
|
数据采集 人工智能 安全
OpenClaw 中文版 Windows 安装教程(包含新安装包)|全自动安装,免命令免代码免折腾
拒绝复杂教程,OpenClaw 汉化一键安装包,自动部署、自动汉化、自动配置,全程无需输入命令,也不用懂编程,安装完成直接使用。
OpenClaw 中文版 Windows 安装教程(包含新安装包)|全自动安装,免命令免代码免折腾
|
12天前
|
缓存 供应链 架构师
数据架构是什么?一文讲清数据架构和技术架构的区别
本文系统解析企业数字化核心框架——“4A架构”(业务、数据、应用、技术架构),阐明其严格递进的逻辑链:业务架构定方向(做什么)、数据架构转语言(数据化表达)、应用架构落功能(系统实现)、技术架构保运行(稳定支撑)。破除“重技术轻业务”误区,助企业构建贴合实际、可演进的数字化架构体系。
数据架构是什么?一文讲清数据架构和技术架构的区别
|
1天前
|
人工智能 Rust 前端开发
边缘智能与硬件融合——软件定义的新边界
教程来源 http://yvyus.cn/category/shengxiaoyunshi.html 2026嵌入式开发迎来深度变革:敏捷化转型打破软硬壁垒;TinyML赋能边缘智能,实现低延时高隐私;RISC-V崛起终结硬件锁定;Qt 6.x统一跨平台UI,覆盖MCU至高端显示;全栈生态融合边缘、云与端,构建高效协同数字系统。
|
13天前
|
数据采集 人工智能 监控
OpenClaw跨境亚马逊商品采集Skill全攻略:阿里云/本地部署+千问/Coding Plan配置实战教程
在跨境电商运营中,商品数据采集、竞品分析、价格监控、市场调研是日常高频且耗时的工作。传统方式需要编写爬虫脚本、处理IP封禁、解决动态页面渲染,门槛高、维护成本大。OpenClaw作为轻量化AI智能体框架,支持通过Skill扩展实现零代码数据采集,配合专业采集接口,可快速完成亚马逊等平台的商品信息抓取,并自动生成结构化报表。
344 0
|
3天前
|
人工智能 供应链 安全
2026 年网络威胁态势与智能防御体系研究 —— 基于 Check Point 威胁情报报告
本文基于Check Point 2026年4月威胁情报,系统剖析AI驱动攻击、供应链入侵、高危零日漏洞及定向威胁新趋势;提出以威胁情报驱动、AI检测、漏洞闭环、零信任与供应链安全为核心的一体化防御体系,并提供可落地的检测代码、配置与响应流程。(239字)
162 13