扩展库 / json5

json5

将 JSON5 配置文本解析为 xlang 动态值。

支持注释、尾随逗号、单引号、Unicode 标识符键名等 JSON5 语法;重复键拒绝。整份源文本须为有效 UTF-8,包括注释内容。输入上限 64 MiB,嵌套上限 64 层(根容器和空容器各计一层,标量不另占层),容器项数上限 100 万。超限抛 RangeError,语法或编码错误抛 ValueError;valid 对两者均返回 false。

当前发布验收待主线修复:解析得到的整数 var 再调用 float(value) 会被误作精确类型取出而报 TypeError;无扩展库的纯语言最小源也可复现。默认门禁保留正确的消费正例,不能以其他测试通过视为整包发布通过。

API

接口用途
json5.parse(text)返回保留原始类型的动态值
json5.valid(text)检查语法和包内数据约束;内存不足抛 MemoryError
json5.getValue(text, path)按简单点号路径取原始类型
json5.get(text, path)按简单点号路径取标量文本

十六进制字面量中的 e/E 是数字;如 0xdead、0xBEEF 在 int64 范围内保留整数类型,超出时才转为有限 float64,并按最近值、中点取偶数只舍入一次;例如 0x8000000000000401 不再逐位累加丢失末尾精度。

范例

import json5
string source = "{host:'localhost', workers:4,}"
var config = json5.parse(source)
println(config["host"])
println(json5.valid(source))
println(json5.getValue(source, "workers"))
println(json5.get(source, "host"))

点号路径不适用于含点或解码后含 NUL 的键;此时先解析再用索引访问。路径查询先校验整份文档,尾部垃圾不会因提前命中而漏检;路径内嵌 NUL 会被拒绝。原始 NUL 源字节无效,字符串中的 \u0000 转义会按完整长度保留;getValue 可读取含 NUL 的值,get 不会返回截断文本。字符串中的 UTF-16 代理对合成为 UTF-8 字符,孤立代理项拒绝。显式 Infinity/NaN 可解析,有限数字字面量溢出 float64 时拒绝,不静默转换成无穷大。get 的原生结果由 @owned string 直接接管;C 内部仍会构造标量文本,不承诺整条查询零复制。

2026-10-30 修复非 ASCII identity escape 只读首字节、实际 U+2028/U+2029 续行被拒绝、单行注释吞掉分隔符后内容,以及字符串续行和注释的位置诊断。原始 LS/PS 字符串内容保留,反斜线后的实际 LS/PS 作为续行删除。公开 API 与既有限额不变;严格 JSON 仍拒绝 identity escape。

新增 C/XLang 各 120 组文档,C 另有 18 个位置诊断和 8 个实际分配故障点。两平台相同最终回归只换旧解析器均有 207 条断言失败,新解析器全部通过;各 10 份普通独立 AOT、新旧双语 JIT 与黄金输出通过,Linux C 带 ASan/UBSan。Windows 默认门禁前 49 项通过,末项 M10 仍失败;独立补验 M10 AOT 也仍抛 TypeError,不记作整包绿灯。

官方 JSON5 2.2.3 的可选对照现覆盖 834 个固定解析样本,其中 646 个核对解析值;本轮只在 Windows 运行,Linux 没有可选 Node。这不是完整规范认证。C/XLang 新增 unicode_config 配置范例,涵盖续行、中文 identity escape、Unicode 注释分隔符并核对同一黄金输出;用法、所有权、补丁来源及验证命令见包内 README。官网页是可生成的源码,未据此宣称部署。

examples/json5_c.c 同时包含包内解析器与原生桥,可直接用 xl run release/extlibs/json5/examples/json5_c.c 运行;Windows/Linux 包门禁将输出与严格 C 编译结果逐字比较。