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()  // "小红" → "小红" (中文无影响,英文爽翻)

相关文章
|
Python
wxPython StaticText控件背景色透明
wxPython StaticText控件背景色透明
433 0
|
缓存 负载均衡 网络协议
面试题22解析-CDN分析
题目:描述一下CDN的工作机制?
1814 0
|
3月前
|
数据采集 人工智能 安全
OpenClaw 中文版 Windows 安装教程(包含新安装包)|全自动安装,免命令免代码免折腾
拒绝复杂教程,OpenClaw 汉化一键安装包,自动部署、自动汉化、自动配置,全程无需输入命令,也不用懂编程,安装完成直接使用。
OpenClaw 中文版 Windows 安装教程(包含新安装包)|全自动安装,免命令免代码免折腾
|
3月前
|
安全 编译器 C语言
变参模板的前世今生——从va_list到参数包的演进
C++对可变数量参数的支持经历了漫长的演进。从C语言的va_list宏,到C++11的变参模板,再到C++17的折叠表达式,每一次进步都提升了类型安全性和表达能力。
172 7
|
3月前
|
SQL 人工智能 运维
公众号-4/7活动预告
4月11日北京,OpenClaw「企业实战专场」重磅来袭!告别玩具标签,龙虾进化出铁钳:支持TB级自进化记忆、VM级安全隔离、专家级业务理解。现场技能闪电秀+擂台赛,直击运维巡检、SSO接入、Vibe Coding等真实生产痛点。80席限量预约,共探AI Agent如何成为企业智能中枢。
184 3
|
4月前
|
弹性计算 人工智能 大数据
阿里云服务器2026年新购、续费活动解析:特价实例、续费同价与多重权益
2026年阿里云推出云服务器新购与续费优惠活动,特价云服务器方面,轻量应用服务器年付38元起,且2核4G轻量应用服务器低至9.9元/月,还有“99计划”提供ECS云服务器长效特惠;其他新购优惠方面,新品通用算力型u2i/u2a实例享折扣,九代云服务器也有新购与升级优惠。此外,阿里云还通过免费试用、优惠券、企业专项补贴、AI与大数据优惠等活动,全方位降低用户上云门槛,助力业务创新增长。
|
3月前
|
人工智能 Rust 前端开发
边缘智能与硬件融合——软件定义的新边界
教程来源 http://yvyus.cn/category/shengxiaoyunshi.html 2026嵌入式开发迎来深度变革:敏捷化转型打破软硬壁垒;TinyML赋能边缘智能,实现低延时高隐私;RISC-V崛起终结硬件锁定;Qt 6.x统一跨平台UI,覆盖MCU至高端显示;全栈生态融合边缘、云与端,构建高效协同数字系统。
|
5月前
|
人工智能 缓存 安全
7 个高效 Java 开发者的「反 AI 陷阱」习惯
AI时代,代码胜负手不再是手速,而是判断力!本文揭秘7大实战习惯:弹性降级、精准喂Context、拒绝炫技、严审依赖、三重审查、真集成测试、设计型Code Review——助你从AI用户跃升为AI驾驶员。(239字)
221 3
|
5月前
|
Go API 数据库
Go 中获取两个切片交集的 6 种方法
本文系统梳理 Go 中切片交集的 6 种实现:从基础双重循环、Map 查表、排序双指针,到泛型通用版、结构体自定义键、多集交集。涵盖性能对比、去重策略与实战选型建议,助你写出高效、健壮、工业级代码。(239字)
179 1
|
5月前
|
安全 Java 开发工具
Git 2.52 实用新特性: 秒级目录溯源 + 大仓自动瘦身
Git 2.52 正式发布!五大重磅新特性:① `git last-modified` 秒查文件最后修改人(提速5.5×);② `geometric` 维护策略,大仓瘦身快6倍;③ `git refs list/exists` 简化引用操作;④ `git repo info` 一键获取仓库元信息;⑤ `git sparse-checkout clean` 安全清理残留文件。(239字)
265 1