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

张开发
2026/4/11 6:32:09 15 分钟阅读

分享文章

gjson:Go 解析 JSON 的“瑞士军刀“,一行代码搞定嵌套地狱!
故事开场深夜加班小明盯着屏幕上的嵌套 JSON 发呆data.user.profile.settings.theme… 写结构体太麻烦用map[string]interface{}类型断言写到崩溃直到他遇见了gjson——“原来解析 JSON 可以这么优雅”✨ gjson 是什么一句话不用定义结构体不用层层断言一行代码提取任意嵌套的 JSON 值。go get-ugithub.com/tidwall/gjson 核心用法点语法像查字典一样简单importgithub.com/tidwall/gjsonconstjson{user:{name:小红,age:18},tags:[Go,Rust]}// 取值就这么简单name:gjson.Get(json,user.name).String()// 小红age:gjson.Get(json,user.age).Int()// 18firstTag:gjson.Get(json,tags.0).String()// Go路径语法速查.访问嵌套字段user.name#数组长度或遍历tags.#→ 2*/?通配符user.n?me→ 匹配 name#(...)条件查询friends.#(age20).name 实战场景3 个让你哇塞的例子 场景1批量提取数组字段// JSON: {users:[{name:A},{name:B}]}names:gjson.Get(json,users.#.name).Array()for_,n:rangenames{println(n.String())// 输出: A, B} 场景2条件过滤精准打击// 找第一个年龄25且姓氏为张的用户result:gjson.Get(json,users.#(age25)#(last张).first)ifresult.Exists(){println(找到啦:,result.String())}⚡ 场景3链式修饰花式处理// 反转数组 取第一个 转大写val:gjson.Get(json,tags|reverse|0|tostr)// 原: [Go,Rust] → 反转: [Rust,Go] → 取0: Rust → 转字符串 我的使用心得避坑指南性能怪兽基准测试显示gjson.Get约 200ns/次零内存分配高并发场景放心用别忘校验外部传入的 JSON 先用gjson.Valid(json)检查避免意外Bytes 优先处理[]byte时用GetBytes避免不必要的 string 转换存在性判断result.Exists()比result.String() ! 更可靠空字符串也是合法值// ✅ 推荐写法ifval:gjson.Get(json,optional.field);val.Exists(){process(val.String())} 彩蛋自定义 Modifier解锁隐藏技能// 添加一个 upper 修饰符把结果转大写gjson.AddModifier(upper,func(json,argstring)string{returnstrings.ToUpper(json)})// 使用把用户名转大写name:gjson.Get(json,user.name|upper).String()// 小红 → 小红 (中文无影响英文爽翻)

更多文章