扩展库 / json.patch
json.patch
对 JSON 值应用指针、操作补丁与合并补丁。
操作返回新文档,不修改原输入;支持 JSON Pointer、JSON Patch 与 JSON Merge Patch 的常用路径。
2026-10-26 Windows/Linux 发布版的 C 边界已通过,但 XLang 字典传给原生 xvalue* 后,has 与 get 不能正确读取已有键。下方 XLang 示例是目标 API,两平台完整语言与 AOT 门禁尚未签收。
2026-10-30:内部 move 不再重复图复制待移动值,先完整复制文档,再在副本内移交引用;copy 仍独立复制。原实现结果正确,本轮是成本优化,不是结果 BUG 修复。输入不变、失败原子性、公开 API/ABI 与错误分类不变。
API
| 接口 | 用途 |
|---|---|
json.patch.apply(document, operations) | 执行 add/remove/replace/move/copy/test |
json.patch.merge(document, patch) | 递归应用 JSON Merge Patch |
get / has / set / remove | 通过 JSON Pointer 读取或更新 |
encodePointer(key) | 编码单个键段并加前导斜杠 |
范例
import json.patch
var old = {"values": [1, 2]}
var changed = json.patch.apply(old,
[{"op": "add", "path": "/values/1", "value": 9}])
assert json.patch.get(changed, "/values/1") == 9
examples/workflow.xl 与 examples/workflow_c.c 对照展示 test、copy、move、replace、add、remove,以及 merge、set、has、get;入门范例另展示 encodePointer。两份工作流都检查原文档不变。
新增 examples/relocate.xl / relocate_c.c 从标准 JSON 文本读取同一配置,复制备份、移动发布项并独立改标题,再验证失败原子性,五行共同黄金输出。json.parse 返回的原生值可用,不代表语言字面量投影已通过;旧正例仍为必过项,不新增私有工厂绕行。
examples/basic_c.c 和 examples/workflow_c.c 可直接使用 xl run release/extlibs/json.patch/examples/basic_c.c 等命令单文件运行,无需手动配置头文件和链接;Windows/Linux 包门禁会与严格 C 编译结果逐字比较。
输入应是 JSON 可表示的值;指针最多 32 段、解码后每段最多 255 字节。encodePointer 对超过该长度的键报错,转义后变长但原键未超限的路径仍可使用。复制失败保留 XRT 内存错误,不误报为无效补丁。C/XLang 测试另核对 RFC 6902 的 /~01 转义顺序及向 /- 插入整个数组。Linux 门禁包含 C ASan/UBSan、语言边界及双语范例;Windows 门禁还计划执行两组范例 AOT。当前 Windows 门禁在语言字典投影处退出,后续阶段未执行。C 结果所有权、根 remove 约定与验证命令见包内 README。
C 的零终止 JSON Pointer 便利入口最多扫描 16,353 字节以判定 16,352 字节上限;超限输入直接报错,不先执行无界 strlen。恰好达到上限的合法路径及超限无终止字节缓冲均有 Windows/Linux 边界测试;C 调用方仍须提供在该范围内可读取的缓冲区。
补丁数组中的每一项必须是对象;非对象项统一报告无效补丁,输入文档保持不变。C/XLang 负例覆盖 null、数字、数组和字符串项。当前发布版的完整 AOT 尚未执行到此阶段。
当前验证
powershell -NoProfile -ExecutionPolicy Bypass -File release/extlibs/json.patch/test/check.ps1
bash release/extlibs/json.patch/test/check.sh
命令从仓库根目录执行,需 GCC,可用 CC 指定路径。默认门禁含真实两模块独立运行库、原 C、新32项结果/释放顺序和16条逐点OOM/立即恢复、八条实际生成原型、双语新例及五个独立程序;Linux 增加 ASan/UBSan/泄漏检查。输入指纹、逐进程超时、命令及输出保留;失败不删现场。最后仍强制原语言字典正例,当前 Windows 预验在 M1 报 has /name 失败,不能签收整包,最终双平台证据见仓库验收矩阵。
可选固定 python-json-patch1.35/jsonpointer3.0.0 参照扩为420项,原/新结果相同。成本夹具的0..4096项字符串数组,非空move分配11降至8次、空数组9降至7次,copy不变;XRT会保留不可变标量,不意味着所有字符串正文都被重复复制,也不外推完整应用提速。没有修改主线或XRT,本页源更新不代表外部官网已部署。