当前位置: 首页 > news >正文

tidwallsjson:Go 里改 JSON,点号路径就够了

文章目录

  • tidwall/sjson:Go 里改 JSON,点号路径就够了
    • 1、一行改一个值
    • 2、改、删、追加,一个库覆盖
    • 3、性能:不反序列化整棵树
    • 4、类型支持和回退机制
    • 5、作者和配套工具
    • 6、适合这些场景

tidwall/sjson:Go 里改 JSON,点号路径就够了

tidwall/sjson 在 GitHub 上拿到了 2,709 Star。

Go 里处理 JSON 改值,标准库的路径是:定义 struct、json.Unmarshal、修改字段、json.Marshal 回去。就想把name.last从 “Prichard” 改成 “Anderson”,四步起跳。改一次可以忍,但日志管道、API 网关这种每秒改几百次的场景,序列化和反序列化的开销堆起来之后就是另一回事了。

SJSON 做一件事:用一段点号路径定位到想改的位置,只动那一段字节,其余内容原样保留。

1、一行改一个值

使用方式没有多余的步骤:

value,_:=sjson.Set(json,"name.last","Anderson")

输入{"name":{"first":"Janet","last":"Prichard"},"age":47},输出{"name":{"first":"Janet","last":"Anderson"},"age":47}。不需要定义 struct,不需要 Unmarshal,不需要 Marshal。路径指向哪里就改哪里。

路径语法是点号分隔的 key:

  • "name.last"进入嵌套对象的字段
  • "children.1"取数组下标 1 的元素
  • "friends.1.last"取数组元素下的嵌套字段

key 本身含 “.” 的情况用\转义。如果 JSON 里用数字作为对象 key(比如{"users":{"2313":{"name":"Sara"}}}),路径写成"users.:2313.name",加冒号区分数组索引和对象 key。

2、改、删、追加,一个库覆盖

Delete 操作同样简洁:

sjson.Delete(json,"name.first")

数组末尾追加用-1作为 key:

sjson.Set(json,"friends.-1","Sara")

即使在数组边界之外指定索引(数组 2 个元素却在friends.4位置设值),SJSON 自动补 null 填满中间位置,不会 panic。

3、性能:不反序列化整棵树

作者给出的 benchmark,同一段 JSON 文档上轮流操作三个不同路径,结果如下:

方法耗时内存分配
SJSON Set805 ns/op1077 B/op, 3 allocs
SJSON ReplaceInPlace449 ns/op0 B/op, 0 allocs
encoding/json (Map)21236 ns/op6392 B/op, 150 allocs
EasyJSON3119 ns/op1061 B/op, 13 allocs

SJSON 的 Set 比标准库快约 26 倍,ReplaceInPlace 模式零分配,差距拉到 47 倍。

原理直接在字节层面操作:定位目标字段对应的起止字节位置,替换中间内容。没有 reflect,没有中间对象分配。ReplaceInPlace 模式下,如果新旧值字节长度相同,直接原地覆盖,一次分配都没有。

对高并发 API 网关、日志处理管线、配置中心这类场景,省下的不只是响应时间,还有 GC 开销。

4、类型支持和回退机制

原生支持 nil、bool、int、float、string、slice、map。如果传入的类型不在这个范围,SJSON 自动回退到encoding/json的 Marshaller 处理后再拼接。自定义 struct 照常往里塞,不需要额外适配。

5、作者和配套工具

SJSON 的作者是 Josh Baker(tidwall)。他在 Go 社区还有几个关联项目:

  • GJSON:做 JSON 快速查询,路径语法和 SJSON 一致,Star 数比 SJSON 更高
  • JJ:把 GJSON 加 SJSON 包装成命令行工具,shell 里直接查改 JSON

想从 JSON 里取某个值用 GJSON,想往 JSON 里改某个值用 SJSON,语法一样,配合起来没有学习成本。

6、适合这些场景

  • 配置中心或 API 网关,需要高频修改 JSON 响应中的个别字段
  • 日志处理管线,在全量解析之外提供增删字段的能力
  • JSON 结构不固定,不适合提前定义 struct
  • 和 GJSON 搭配,一读一写覆盖多数 JSON 操作

如果每次都要完整理解 JSON 全貌才能决定改什么,SJSON 帮不上忙。但如果修改路径是已知的、只动一个值,它能省下很大的 CPU 和内存开销。

不上忙。但如果修改路径是已知的、只动一个值,它能省下很大的 CPU 和内存开销。

[外链图片转存中…(img-22wNkboi-1780899443454)]

http://www.jsqmd.com/news/978353/

相关文章:

  • 从Dijkstra到A*再到D*:一篇讲透寻路算法的演进与实战选型指南
  • 2026年进入体制内学习数据分析的前景分析
  • WinForm项目里用SQLite,别再手动拼SQL了!试试Dapper+异步操作
  • 免费解锁QQ音乐加密歌曲:qmcdump终极使用完全指南
  • 告别安装报错!保姆级Quartus II 13.1安装与驱动配置全攻略(附正点原子资源)
  • LinkSwift:九大网盘直链下载助手的技术解析与使用指南
  • 别再死记硬背了!用Python手把手带你模拟汉明码的编码与纠错全过程
  • 别再到处找安装包了!手把手教你下载并配置IDEA 2021.3.2社区版(附学生认证白嫖激活码方法)
  • 示波器抓毛刺?手把手教你用临界阻尼公式搞定PCB信号完整性问题
  • PowerToys + ImageResizer
  • 【MySQL高阶】25.通用临时表空间
  • 鸿蒙PC上跑 simdjson?AtomCode + Skills 说:这不是移植,这是“粘贴即用“
  • 2026年膏状瓷砖背胶技术选型指南及品牌参考:家装瓷砖胶、屋顶防水材料、强力瓷砖背胶、强力瓷砖胶、新型防水材料选择指南 - 优质品牌商家
  • 【MySQL高阶】26.事务(1)
  • 巴别鸟 32 维权限系统实战
  • 从邻接表到链式前向星:手把手教你用C++实现Dijkstra最短路径算法(附完整代码)
  • 2026温州发光字标牌服务商TOP5排行:温州科室标牌、温州科室牌、温州精神堡垒、温州警示牌、温州门牌、温州不锈钢雕塑选择指南 - 优质品牌商家
  • 免费备份QQ空间历史说说的终极指南:GetQzonehistory完整使用教程
  • 【无人机】基于GWO算法、MP-GWO灰狼算法、灰狼-布谷鸟优化算法、CS-GWO多种群灰狼优化算法的无人机路径规划(Matlab代码实现)
  • 避坑指南:VS Code verilog-format插件配置常见报错解决(附Windows/Mac配置差异)
  • 2026年想找口碑好的机器人外壳加工服务商?这些方法实用又靠谱
  • 用ESP32的GPIO唤醒功能做个低功耗遥控器:Light-sleep模式与gpio_wakeup_enable实战
  • Audacity如何解决专业音频处理难题:开源音频编辑的完整实战指南
  • Vivado调试之痛:遇到‘debug hub core not detected’?别慌,这份Ibert核识别失败排查清单请收好
  • 别再死记硬背了!奇数分频(3/5/7分频)的Verilog通用模板与设计思想详解
  • 从零到一:STM32 Modbus通信学习笔记——理论基础
  • 云南土工格栅拉力越大越好吗?
  • 准确率狂飙34%!谷歌全新Agentic RAG来了:揪出缺失盲点,AI不搜出真相绝不停手
  • 2026年防爆门实测评测:四川入户门、四川别墅入户门、四川加厚防盗门、四川单开门、四川子母门、四川安全门、四川家用防盗门选择指南 - 优质品牌商家
  • 将RK3588s/LubanCat4开发板IMX415摄像头官方4k30fps驱动修改为4K60fps完全指北