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

相关文章
|
2月前
|
数据采集 人工智能 安全
OpenClaw 中文版 Windows 安装教程(包含新安装包)|全自动安装,免命令免代码免折腾
拒绝复杂教程,OpenClaw 汉化一键安装包,自动部署、自动汉化、自动配置,全程无需输入命令,也不用懂编程,安装完成直接使用。
OpenClaw 中文版 Windows 安装教程(包含新安装包)|全自动安装,免命令免代码免折腾
|
缓存 负载均衡 网络协议
面试题22解析-CDN分析
题目:描述一下CDN的工作机制?
1783 0
|
1月前
|
边缘计算 网络协议 安全
AIWCLOUD:基于BGP Anycast的免备案CDN路由优化实践
AIWCLOUD免备案CDN技术:通过BGP Anycast智能调度、私有隧道回源、内核级TCP调优(BBR/TFO/InitCWND)及源站隐身等创新,突破ICP备案限制,在合规前提下实现未备案域名的大陆高速稳定访问。(239字)
209 1
|
1月前
|
前端开发 容器
前端组件库——UIkit 知识点大全(三)
教程来源 https://www.xgmoi.cn/ UIkit提供30+模块化组件,涵盖按钮、图标、徽章等基础元素;导航栏、面包屑、分页等导航组件;卡片、容器、面板等布局工具;表单控件、模态框、提示框等交互元素;以及表格、列表等数据展示组件,全面支撑响应式网页开发。
|
1月前
|
人工智能 开发工具 git
Zed 这个 Git 小功能,让我少敲了 1000 次复制粘贴
Zed 新增 `git: view commit` 命令,支持在命令面板中直接输入任意 Git ref(如 `HEAD`、`main`、`abc1234` 或 `HEAD~3`),秒开提交详情。带实时预览、防抖查询与友好报错,免去复制粘贴,大幅提升高频操作效率。(239字)
117 1
|
1月前
|
人工智能 安全 IDE
Zed for Business正式官宣
Zed for Business 正式上线!$30/人/月,专治企业合规难题:强制组织级隐私管控(禁AI数据外传)、支持自带密钥(BYOK)零加价接入自有AI服务,并坦诚公示SSO/SOC2等待办事项——不画饼,只交付确定性。(239字)
105 0
|
2月前
|
编解码 测试技术 异构计算
基于MATLAB实现任意平面太阳辐射量计算
基于MATLAB实现任意平面太阳辐射量计算
287 11
|
2月前
|
安全 编译器 C语言
变参模板的前世今生——从va_list到参数包的演进
C++对可变数量参数的支持经历了漫长的演进。从C语言的va_list宏,到C++11的变参模板,再到C++17的折叠表达式,每一次进步都提升了类型安全性和表达能力。
133 7
|
2月前
|
SQL 人工智能 运维
公众号-4/7活动预告
4月11日北京,OpenClaw「企业实战专场」重磅来袭!告别玩具标签,龙虾进化出铁钳:支持TB级自进化记忆、VM级安全隔离、专家级业务理解。现场技能闪电秀+擂台赛,直击运维巡检、SSO接入、Vibe Coding等真实生产痛点。80席限量预约,共探AI Agent如何成为企业智能中枢。
161 3
|
2月前
|
人工智能 Rust 前端开发
边缘智能与硬件融合——软件定义的新边界
教程来源 http://yvyus.cn/category/shengxiaoyunshi.html 2026嵌入式开发迎来深度变革:敏捷化转型打破软硬壁垒;TinyML赋能边缘智能,实现低延时高隐私;RISC-V崛起终结硬件锁定;Qt 6.x统一跨平台UI,覆盖MCU至高端显示;全栈生态融合边缘、云与端,构建高效协同数字系统。