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月前
|
人工智能 自然语言处理 API
EmbeddingGemma 2:740M 多模态嵌入怎么跑离线 RAG
EmbeddingGemma 2 是 Google DeepMind 发布的 740M 开放权重嵌入模型。本文拆解它的模块化编码器:文本与代码 270M、视觉 +170M、音频 +300M,四档参数落在同一个 768 维向量空间,扩模态不必重建向量库;并说明 MRL 截断到 512/256/128 维时的质量取舍(256 维时图像、视频、语音约保留 95%)、截断后需重新做 L2 归一化,以及把检索链路整体塞进手机、笔记本或浏览器、不经过网络请求相比云端嵌入 API 的取舍。
314 0
|
1月前
|
Rust Go
Zed 自动补全的坑终于填上了
Zed修复了LSP补全逻辑缺陷:此前因LSP未提供textEdit时,Zed会错误替换光标后整词,导致代码被“背刺”。现改为以光标位置为编辑边界,尊重用户lsp_insert_mode配置,补全更精准可靠。(239字)
112 0
|
1月前
|
人工智能 安全 调度
VSCode AI新特性:HydraFusion来了:系统会自己组队干活
VS Code新推HydraFusion:智能多模型协同系统,自动评估任务难度,动态调度轻量/重型模型,支持初稿生成+审稿校验双流程,兼顾速度、质量与成本,告别手动切换烦恼。(239字)
190 0
|
1月前
|
IDE Java Maven
IDEA run/debug anything:这些技巧你一定没用过
IntelliJ IDEA 的「Run Anything」(双击 Ctrl)是隐藏的高效入口:一键打开项目、运行配置、执行 Maven/Gradle 命令或终端指令,支持智能补全、上下文执行与参数链式输入,融合 CLI 速度与 IDE 智能,大幅提升键盘操作效率。(239字)
|
7月前
|
SQL 人工智能 运维
公众号-4/7活动预告
4月11日北京,OpenClaw「企业实战专场」重磅来袭!告别玩具标签,龙虾进化出铁钳:支持TB级自进化记忆、VM级安全隔离、专家级业务理解。现场技能闪电秀+擂台赛,直击运维巡检、SSO接入、Vibe Coding等真实生产痛点。80席限量预约,共探AI Agent如何成为企业智能中枢。
242 3
|
7月前
|
数据采集 人工智能 安全
OpenClaw 中文版 Windows 安装教程(包含新安装包)|全自动安装,免命令免代码免折腾
拒绝复杂教程,OpenClaw 汉化一键安装包,自动部署、自动汉化、自动配置,全程无需输入命令,也不用懂编程,安装完成直接使用。
OpenClaw 中文版 Windows 安装教程(包含新安装包)|全自动安装,免命令免代码免折腾
|
3月前
|
人工智能 安全 Cloud Native
云上大模型安全围栏设计:链路、能力与 POC 指标
云上大模型应用的安全围栏,通常需要覆盖输入检测、输出复检、策略处置、日志审计、样本回流和合规治理。评估这类方案时,不建议只看厂商介绍或功能清单,更应关注它与模型服务、业务系统、日志平台、权限体系和安全运营流程的集成方式。本文以工程落地为主线,梳理大模型安全围栏的常见架构、方案类型和 POC 指标。
|
4月前
|
人工智能 自然语言处理 JavaScript
ERP开源软件:GVV-AI-ERP 的业务自动化与模型接入设计
GVV-AI-ERP 是面向采购、销售、库存、财务与生产管理的 AI 驱动 ERP 开源项目。其以 Vue 3、Spring Boot、MySQL、Redis 和模型接入层组合业务流程、自然语言交互、知识库与数据分析能力,并支持 Docker 化部署。
|
4月前
|
人工智能 监控 安全
字节开源 DeerFlow 2.0:让 AI 不止于聊天
字节开源 DeerFlow 2.0 超智能 Agent 框架,MIT 协议开源,主打复杂长任务处理。依托子智能体、技能流程、沙盒代码执行与跨会话记忆,可自主拆解任务、存文件、定时自动化,适合开发者搭建 AI 工作系统,突破传统单轮对话 AI 局限。