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

相关文章
|
存储 JSON 网络协议
微服务Consul集群搭建
Consul是HashiCorp的开源工具,用于服务发现、配置管理和分布式一致性。它提供服务注册与发现、健康检查、KV存储、多数据中心支持,并基于Raft协议保证一致性。Consul还具有DNS接口和Web UI。要安装,可从HashiCorp或阿里云下载,使用`yum`在Linux上安装。启动单机模式用`consul agent -dev`,集群部署涉及配置文件如`/etc/consul.d/consul.hcl`。常用命令包括启动、加入集群、查看成员及服务管理等。
1070 0
微服务Consul集群搭建
|
16天前
|
IDE Linux Go
Github 开源一周1.2k star,Go主打的第一款Agent IDE官宣开源了
Rune IDE:Go编写、GPU加速的全新键盘驱动编辑器,融合GUI与tmux终端体验。支持Vim/Emacs/VS Code三套统一键控,命令式操作、可编辑文件浏览器、内置Go调试器(dlv),开源于2026年9月,当前仅限macOS/Linux。(239字)
|
6月前
|
数据采集 人工智能 安全
OpenClaw 中文版 Windows 安装教程(包含新安装包)|全自动安装,免命令免代码免折腾
拒绝复杂教程,OpenClaw 汉化一键安装包,自动部署、自动汉化、自动配置,全程无需输入命令,也不用懂编程,安装完成直接使用。
OpenClaw 中文版 Windows 安装教程(包含新安装包)|全自动安装,免命令免代码免折腾
|
6月前
|
安全 编译器 C语言
变参模板的前世今生——从va_list到参数包的演进
C++对可变数量参数的支持经历了漫长的演进。从C语言的va_list宏,到C++11的变参模板,再到C++17的折叠表达式,每一次进步都提升了类型安全性和表达能力。
244 7
|
6月前
|
SQL 人工智能 运维
公众号-4/7活动预告
4月11日北京,OpenClaw「企业实战专场」重磅来袭!告别玩具标签,龙虾进化出铁钳:支持TB级自进化记忆、VM级安全隔离、专家级业务理解。现场技能闪电秀+擂台赛,直击运维巡检、SSO接入、Vibe Coding等真实生产痛点。80席限量预约,共探AI Agent如何成为企业智能中枢。
222 3
|
6月前
|
人工智能 Rust 前端开发
边缘智能与硬件融合——软件定义的新边界
教程来源 http://yvyus.cn/category/shengxiaoyunshi.html 2026嵌入式开发迎来深度变革:敏捷化转型打破软硬壁垒;TinyML赋能边缘智能,实现低延时高隐私;RISC-V崛起终结硬件锁定;Qt 6.x统一跨平台UI,覆盖MCU至高端显示;全栈生态融合边缘、云与端,构建高效协同数字系统。
|
前端开发 安全 数据安全/隐私保护
WPA_CLI 的介绍:介绍如何使用wpa_cli连接WiFi的方法
WPA_CLI 的介绍:介绍如何使用wpa_cli连接WiFi的方法
2197 2
|
JSON Go 数据格式
Go 读取 YAML 配置文件的两种方式
本文介绍了读取 YAML 配置文件的两种方式,第一种是通过 yaml.v3 包,第二种是通过 viper 包。如果是在项目里解析配置文件,推荐使用 viper 包,它支持解析多种格式的配置文件,监听配置文件的更新,修改配置文件等。
2288 1
Go 读取 YAML 配置文件的两种方式
|
SQL 关系型数据库 Go
《增强你的PostgreSQL:最佳扩展和插件推荐》
《增强你的PostgreSQL:最佳扩展和插件推荐》
1865 0
|
存储 Oracle 关系型数据库
数据库数据恢复—ORACLE常见故障的数据恢复方案
Oracle数据库常见故障表现: 1、ORACLE数据库无法启动或无法正常工作。 2、ORACLE ASM存储破坏。 3、ORACLE数据文件丢失。 4、ORACLE数据文件部分损坏。 5、ORACLE DUMP文件损坏。
714 11