当前位置: 首页 > 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.zskr.cn/news/1490086.html

相关文章:

  • 2026中国黑自然面石材厂家实测评测:中国黑荔枝面石材/湛江黑石材/火山岩洞石石材/蒙古黑石材/中国黑光面石材/选择指南 - 优质品牌商家
  • 完整汉化去码指南:HS2-HF补丁让Honey Select 2游戏体验全面升级
  • 别再死记硬背了!用Python手把手带你模拟汉明码的编码与纠错全过程
  • 巴别鸟 32 维权限系统实战
  • 2026温州发光字标牌服务商TOP5排行:温州科室标牌、温州科室牌、温州精神堡垒、温州警示牌、温州门牌、温州不锈钢雕塑选择指南 - 优质品牌商家
  • 免费备份QQ空间历史说说的终极指南:GetQzonehistory完整使用教程
  • 【无人机】基于GWO算法、MP-GWO灰狼算法、灰狼-布谷鸟优化算法、CS-GWO多种群灰狼优化算法的无人机路径规划(Matlab代码实现)
  • 避坑指南:VS Code verilog-format插件配置常见报错解决(附Windows/Mac配置差异)
  • 用ESP32的GPIO唤醒功能做个低功耗遥控器:Light-sleep模式与gpio_wakeup_enable实战
  • 2026年防爆门实测评测:四川入户门、四川别墅入户门、四川加厚防盗门、四川单开门、四川子母门、四川安全门、四川家用防盗门选择指南 - 优质品牌商家
  • 准确率狂飙34%!谷歌全新Agentic RAG来了:揪出缺失盲点,AI不搜出真相绝不停手
  • 将RK3588s/LubanCat4开发板IMX415摄像头官方4k30fps驱动修改为4K60fps完全指北
  • 2026郑州自流平砂浆技术选型指南:郑州聚合物砂浆/郑州聚合物砂浆/郑州金刚灰砂浆/郑州金刚灰砂浆/郑州防水抗裂砂浆/选择指南 - 优质品牌商家
  • 2016年6月重庆配眼镜最新排行指南:5家连锁品牌实测对比 - 奔跑123
  • STM32 Modbus通信实战:从硬件到软件的完整指南
  • 用STM32F103驱动TPC116S8 DAC芯片:一个完整工程代码的解析与移植指南
  • 2026徐闻一站式装修评测:徐闻商铺装修/徐闻奶茶店装修/徐闻家装/徐闻本地装修/徐闻水果店装修/徐闻精装修/徐闻自建房装修/选择指南 - 优质品牌商家
  • 【数据库系统原理】第10篇:SQL高级查询机制:嵌套子查询与相关子查询的执行窥探
  • WPS Office 与 Microsoft Office 出现冲突的解决方法
  • 完全免费!AMD Ryzen处理器调试工具终极使用手册
  • 3步将PDF变成播客:Open NotebookLM让你的文档开口说话
  • 2026年精密数控件费用排名,琳珑异型件收费合理 - 工业设备
  • 用STM32CubeMX和HAL库搞定蓝桥杯嵌入式:第九届省赛倒计时器项目全解析(附工程)
  • Openfire部署后必做的5件事:从基础设置到插件、聊天室与REST API启用
  • OBS多平台直播插件终极指南:obs-multi-rtmp 5分钟快速配置教程
  • 从零到云:用一台旧电脑+CentOS 7 搭建你的第一个OpenStack私有云实验环境
  • 高压开关测试仪核心参数解析与行业可靠选型指南:真空断路器开关特性测试仪/高压开关断路器特性测试仪 检定装置/高压开关机械特性测试仪检定装置/选择指南 - 优质品牌商家
  • 别再只用UUID v4了!聊聊UUID的5个版本,以及如何在MySQL和PostgreSQL里高效存储它们
  • 不止于Hello World:用PyQt5-tools 5.15.9快速设计一个简易计算器UI并打包成exe
  • 2026年国内无局放工频耐压试验装置主流品牌盘点:充气式试验变压器/变压器综合特性测试仪/变压器综合试验测试仪/选择指南 - 优质品牌商家