模块契约JSON
错误
所有模块错误使用 xrt.json 域:
语法、限制、重复键和数值错误尽量携带零基字节偏移与一基行列:
xrtJsonErrorLocation 只读取位置数据,不修改错误。非 JSON 错误或不带位置的 JSON 错误返回 false。
字符串 token
json_escape 是不依赖 DOM、Buffer 和完整 Writer 的底层能力。xrtJsonQuoteWrite 严格校验 UTF-8,并把包含首尾双引号的 JSON 字符串 token 分段写入同步回调。可独立选择斜杠、HTML 字节和非 ASCII 转义;失败时返回 xrt.json 错误及 UTF-8 字节位置。
完整 JSON/XLON Writer 与 Logger JSONL 共用这一实现,不再分别维护字符串转义规则。
json 提供严格 JSON 校验、事件访问、xvalue DOM 转换、增量写出和文件读写。程序内部长期持有的数据继续使用 xvalue;JSON 是文件、HTTP 和其他外部边界上的标准交换格式。
裁剪与依赖
| 能力 | 公开选择宏 | 实现宏 | 主要依赖 |
|---|---|---|---|
| 公共错误与位置 | XRT_MODULE_JSON_CORE | XRT_FEATURE_JSON_CORE | core |
| 校验、事件访问、DOM 解析 | XRT_MODULE_JSON_READ | XRT_FEATURE_JSON_READ | json_core, buffer, number, unicode, value_container |
| DOM 与增量写出 | XRT_MODULE_JSON_WRITE | XRT_FEATURE_JSON_WRITE | json_core, buffer, number, unicode, value_container |
| JSON 文件读写 | XRT_MODULE_JSON_FILE | XRT_FEATURE_JSON_FILE | json_read, json_write, file_whole |
| 完整 JSON | XRT_MODULE_JSON | XRT_FEATURE_JSON | json_file |
只需要验证或访问事件时选择 XRT_MODULE_JSON_READ,只需要生成响应正文时选择 XRT_MODULE_JSON_WRITE。完整模块不会成为 HTTP 协议层的强制依赖;HTTP 调用方可以直接发送已有 JSON 字节,也可以按需使用这里的构建器。
稳定契约
- 默认只接受 RFC 8259 JSON。注释和尾随逗号必须逐项显式开启。
- 所有文本都使用显式长度,可包含末尾无零字节的输入;JSON 字符串值也可包含解码后的
U+0000。 - 文本必须是合法 UTF-8,
\uXXXX使用 UTF-16 代理对规则转换为 UTF-8。 xrtJsonParse("null")返回xrtValueNull();失败返回 CNULL,两者没有歧义。- 整数字面量优先保存为
int64,非负且超过INT64_MAX时保存为uint64。超出uint64或低于int64范围默认失败,也可显式按double有损接收。 - 读取和写出均有深度、字节与项目预算;默认预算有限,不信任输入不会无限消耗资源。
xrtJsonValid对合法输入不分配动态内存。xrtJsonVisit不构造 DOM,但含转义字符串会使用可复用的临时缓冲。- 事件中的名称、字符串和数字视图只借用到回调返回,调用方保存时必须复制。
- sink 回调必须在返回前消费字节。事件和 sink 回调新设置的错误会原样传播;未设置错误的失败会由 JSON 层补充稳定错误。
- 增量写入器不可重入。任一写入失败后进入失败终态,只能释放。
- 文件写出先完整序列化,再原子替换目标;序列化失败不会损坏已有文件。
- 模块不带隐式锁。不同解析器或写入器可并行使用,同一写入器需要由调用方串行访问。
默认预算
这些值是默认上限,不是格式能力上限。服务端应按接口实际需要进一步收紧。
读取配置
配置必须先由 Init 初始化。Reserved 必须保持零。重复键默认拒绝;KEEP 保留首值并完整校验后续值,REPLACE 保留末值。兼容标志只放宽指定语法,不开启单引号、十六进制、NaN 或其他非标准字面量。
DOM 读取
Parse 使用默认严格配置。Read 用于重复键策略、兼容语法和资源预算。返回的 xvalue 由调用方使用 xrtValueRelease 释放;单例 null 同样允许释放。
标准 JSON 类型映射为 XVALUE_NULL、XVALUE_BOOL、XVALUE_INT、XVALUE_UINT、XVALUE_FLOAT、XVALUE_STRING、XVALUE_ARRAY 和 XVALUE_OBJECT。JSON 不表达 bytes、time、set、int-map、handle 或自定义类型。
事件访问
事件结构提供 token 起点、父容器定位和解析值:
对象成员通过 HasName 和已解码 Name 定位,数组成员通过 Index 定位。Raw 只在有符号整数、无符号整数和浮点事件中保存原始数字 token。容器开始和结束分别产生事件,根深度为零。
STOP 是正常提前完成,返回 XJSON_VISIT_STOPPED,不会伪装为错误。FAIL 应先设置业务错误;未设置时 JSON 层建立 XJSON_ERROR_STATE。
写出配置
ESCAPE_HTML 转义 <、>、&,适合嵌入 HTML 的受控场景;它不能替代完整的 HTML 上下文转义。ESCAPE_NON_ASCII 使用 \uXXXX,补充平面字符输出代理对。CONTAINER_COMPAT 把 set 写成数组、int-map 写成字符串键对象,因此属于显式有损兼容。Set 按 Value 的首次插入顺序稳定写出,IntMap 按整数键升序稳定写出;这些顺序只保证编码结果可重复,不赋予集合顺序语义,也不改变 JSON 对象成员无序的协议语义。
非有限浮点默认失败,也可写成 null 或字符串。非 JSON xvalue 默认失败,也可写成 null;SKIP 只在遍历 DOM 对象成员或序列项时跳过值,根值和直接写入的单值不能跳过。
Indent 范围为 0 到 16,只在 PRETTY 时生效。配置必须由 Init 初始化,Reserved 必须保持零。
DOM 写出
Stringify 是常用入口,返回零结尾文本并通过 pSize 返回不含末尾零的字节数,结果由 xrtFree 释放。失败不修改 pSize。
Write 直接把若干字节块同步提交给 sink,不保留完整结果,适合 HTTP 正文、文件抽象或哈希管线。此前已经提交的块无法撤回,因此 sink 模式只保证内部状态正确,不提供事务性输出。
增量写入器
内存写入器保存结果;sink 写入器边生成边提交。两者共享以下状态化操作:
对象中必须按 Name -> Value 交替写入;数组中直接写值。End 结束最近容器。一个写入器只接受一个根值,所有容器结束后调用 Finish 封闭结果。Value 可以在任意值位置写入现有 xvalue 子树,并检测循环引用。
Take 只适用于已经 Finish 的内存写入器,只能成功一次,返回值由 xrtFree 释放。Free 释放写入器及尚未移交的结果。
文件
ReadFile 在读取阶段执行 MaxInputBytes,再按同一配置解析。文件打开、读取、临时文件或替换失败会建立 XJSON_ERROR_IO,底层文件错误保留在原因链中。
示例
解析、读取字段并重新输出:
不构造 DOM,直接生成固定形状的 HTTP JSON 正文:
完整可运行示例位于 examples/data/json/main.c。
JSON 与 XLON
JSON 保持标准、严格和可互操作。需要无损保存 bytes、time、set、int-map 等 XRT 扩展值时使用 XLON;不要通过非标准 JSON 字面量偷偷扩展 JSON 语义。两者共享底层文本、安全预算和错误设计,但保持独立裁剪入口与格式契约。
xjsonerror类型
JSON 模块错误码在 xrt.json 域内保持稳定。
| 值 | 语义 |
|---|---|
XJSON_ERROR_CONFIG | 配置非法 |
XJSON_ERROR_SYNTAX | 语法非法 |
XJSON_ERROR_LIMIT | 超限 |
XJSON_ERROR_DUPLICATE | 失败 |
XJSON_ERROR_NUMBER | 失败 |
XJSON_ERROR_STATE | 状态非法 |
XJSON_ERROR_UNSUPPORTED | 不支持 |
XJSON_ERROR_OUTPUT | 输出失败 |
XJSON_ERROR_IO | 写出失败 |
xjsonlocation类型
文本位置使用零基字节偏移和一基行列;列按 UTF-8 字节计算。
| 字段 | 类型 | 语义 |
|---|---|---|
Offset | size_t | 偏移量 |
Line | size_t | 行号 |
Column | size_t | 列号 |
xjsonreadflag类型
非标准读取能力默认全部关闭,只能由调用方逐项开启。
| 值 | 语义 |
|---|---|
XJSON_READ_COMMENTS | XJSON读方向COMMENTS |
XJSON_READ_TRAILING_COMMA | 允许尾随逗号 |
xjsonduplicate类型
对象重复键必须由 DOM 调用方明确选择处理口径。
| 值 | 语义 |
|---|---|
XJSON_DUPLICATE_REJECT | REJECT |
XJSON_DUPLICATE_KEEP | KEEP |
XJSON_DUPLICATE_REPLACE | 重名成员后者覆盖 |
xjsonbigint类型
超出 int64/uint64 的整数字面量默认失败,显式浮点策略允许有损接收。
| 值 | 语义 |
|---|---|
XJSON_BIGINT_REJECT | XJSONBIGINTREJECT |
XJSON_BIGINT_FLOAT | 浮点形态(超精度可选) |
xjsonreadconfig类型
JSON 读取配置同时约束资源消耗和少量显式兼容语法。
| 字段 | 类型 | 语义 |
|---|---|---|
Flags | uint32 | 标志位 |
Duplicate | xjsonduplicate | Duplicate |
BigInteger | xjsonbigint | BigInteger |
MaxDepth | uint32 | MaxDepth |
MaxInputBytes | size_t | MaxInputBytes |
MaxStringBytes | size_t | MaxStringBytes |
MaxValues | size_t | MaxValues |
MaxContainerItems | size_t | MaxContainerItems |
xjsoneventtype类型
访问事件在回调返回后失效;字符串与名称已经完成反转义。
| 值 | 语义 |
|---|---|
XJSON_EVENT_NULL | 空值 |
XJSON_EVENT_BOOL | 布尔 |
XJSON_EVENT_INT | 有符号整数 |
XJSON_EVENT_FLOAT | 浮点 |
XJSON_EVENT_STRING | 字符串 |
XJSON_EVENT_ARRAY_BEGIN | 数组形态BEGIN |
XJSON_EVENT_ARRAY_END | 数组形态END |
XJSON_EVENT_OBJECT_BEGIN | 对象形态BEGIN |
XJSON_EVENT_OBJECT_END | 对象形态END |
XJSON_EVENT_UINT | 无符号整数事件 |
xjsonvisitaction类型
回调可继续、正常提前停止或报告失败。
| 值 | 语义 |
|---|---|
XJSON_VISIT_NEXT | NEXT |
XJSON_VISIT_STOP | STOP |
XJSON_VISIT_FAIL | 回调失败 |
xjsonvisitresult类型
访问结果明确区分完整完成、调用方停止和解析失败。
| 值 | 语义 |
|---|---|
XJSON_VISIT_ERROR | 失败 |
XJSON_VISIT_DONE | 完成 |
XJSON_VISIT_STOPPED | 回调请求停止 |
xjsonwriteflag类型
输出标志只改变文本表示,不改变 Value 数据。
| 值 | 语义 |
|---|---|
XJSON_WRITE_PRETTY | 写方向 |
XJSON_WRITE_ESCAPE_SLASH | 写方向 |
XJSON_WRITE_ESCAPE_HTML | 写方向 |
XJSON_WRITE_ESCAPE_NON_ASCII | 写方向 |
XJSON_WRITE_CONTAINER_COMPAT | 容器兼容模式 |
xjsonnonfinite类型
非有限浮点默认失败,也可显式写成 null 或字符串。
| 值 | 语义 |
|---|---|
XJSON_NONFINITE_REJECT | REJECT |
XJSON_NONFINITE_NULL | 空值 |
XJSON_NONFINITE_STRING | 字符串表示 |
xjsonunsupported类型
不受 JSON 表达的 Value 默认失败,也可显式写 null 或跳过成员。
| 值 | 语义 |
|---|---|
XJSON_UNSUPPORTED_REJECT | 不支持 |
XJSON_UNSUPPORTED_NULL | 空值 |
XJSON_UNSUPPORTED_SKIP | 跳过 |
xjsonwriteconfig类型
JSON 写出配置提供固定上限;Indent 只在美化输出时生效。
| 字段 | 类型 | 语义 |
|---|---|---|
Flags | uint32 | 标志位 |
NonFinite | xjsonnonfinite | NonFinite |
Unsupported | xjsonunsupported | Unsupported |
MaxDepth | uint32 | MaxDepth |
Indent | uint32 | Indent |
MaxOutputBytes | size_t | MaxOutputBytes |
xjsonwriter类型
增量写入器保持不透明,写入方法不可从输出回调重入。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。
xjsonvisitproc类型
JSON 访问器不得保存事件中的借用视图,失败时应设置更具体的错误。 回调类型;参数与返回语义见签名及各使用方 API 节。
xjsonwriteproc类型
输出回调必须在返回前消费借用字节,失败时应设置具体错误。 回调类型;参数与返回语义见签名及各使用方 API 节。
xrtJsonReadConfigInit函数
初始化严格 JSON、重复键拒绝和有限资源预算的读取配置。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pConfig | 输出 | 非空 | 接收默认配置 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 无 | 纯初始化 | — |
- 无
xrtJsonParse函数
使用默认严格配置解析一个完整 JSON 文本。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Text | 输入 | 借用、严格 UTF-8 | 完整 JSON 文本 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 拥有的 Value DOM(xvalue 族操作/释放) | — |
NULL | 语法错误、超限或 OOM | xrt.json 域错误 |
xrt.json域错误 — 语法非法、超限或截断(Data 含 offset)XERR_MEMORY
范例已编译验证
data/json · data/json · 解析 · 观察
pRoot = xrtJsonParse(XRT_STR_LITERAL(
"{\"name\":\"xrt\",\"features\":[\"json\",\"http\"]}"
));
xrtJsonRead函数
使用高级配置解析一个完整 JSON 文本。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Text | 输入 | 借用 | 完整 JSON 文本 |
pConfig | 输入 | 允许空 | 空 = 默认严格配置 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 拥有的 Value DOM | — |
NULL | 失败 | xrt.json 域错误 |
xrt.json域错误 — 语法非法、超限或截断(Data 含 offset)XERR_MEMORY
xrtJsonValid函数
使用默认严格配置验证一个完整 JSON 文本,不构造 Value DOM。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Text | 输入 | 借用 | 待验证文本 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 合法 JSON | — |
false | 非法 | xrt.json 域错误 |
xrt.json域错误 — 语法非法、超限或截断(Data 含 offset)
xrtJsonVisit函数
直接访问解析事件,不构造中间 DOM。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Text | 输入 | 借用 | 完整 JSON 文本 |
pConfig | 输入 | 允许空 | 读取配置 |
pVisitor | 输入 | 非空 | 事件回调 |
pUserData | 输入 | 任意值 | 回调数据 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
XJSON_VISIT_OK/STOP/ERROR | 完成/回调请求停止/错误 | 错误经 xrtGetError() 报告 |
xrt.json域错误 — 语法非法、超限或截断(Data 含 offset)XERR_CANCELLED— 回调请求停止(STOP 映射)
范例已编译验证
data/json · data/json_tour · 事件 · 观察
xrtJsonVisit(
XRT_STR_LITERAL("{\"code\":200,\"ok\":true}"),
&ReadConfig,
printJsonEvent,
NULL
) != XJSON_VISIT_DONE
xrtJsonErrorLocation函数
从 xrt.json 错误的机器数据中读取文本位置。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pError | 输入 | 非空、xrt.json 域 | 解析错误 |
pLocation | 输出 | 非空 | 接收 Line/Column |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 位置已写出 | — |
false | 错误不带位置数据或参数非法 | XERR_ARGUMENT |
XERR_ARGUMENT— 指针为空或视图非法
xrtJsonWriterCreate函数
创建把增量结果保存在内存中的 JSON 写入器。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pConfig | 输入 | 允许空 | 空 = WriteConfigInit 默认 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 内存型写入器 | — |
NULL | 参数错误或 OOM | XERR_ARGUMENT / XERR_MEMORY |
XERR_ARGUMENT— 指针为空或视图非法XERR_MEMORY
xrtJsonWriterCreateSink函数
创建把增量结果同步提交给回调的 JSON 写入器。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pConfig | 输入 | 允许空 | 输出配置 |
pWrite | 输入 | 非空 | 输出回调(返回前消费字节) |
pUserData | 输入 | 任意值 | 回调数据 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 回调型写入器 | — |
NULL | 参数错误或 OOM | — |
XERR_ARGUMENT— 指针为空或视图非法XERR_MEMORY
范例已编译验证
data/json_tour · data/json_tour · 写入器 · 观察
pWriter = xrtJsonWriterCreateSink(&WriteConfig, exampleCollect, &Sink);
xrtJsonWriterObject函数
在当前位置开始对象;对象中必须先写 Name,数组中直接写值。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pWriter | 输入 | 非空 | 写入器 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已进入对象 | — |
false | 嵌套超限或状态非法 | xrt.json 域错误 |
xrt.json域错误 — 语法非法、超限或截断(Data 含 offset)
xrtJsonWriterArray函数
在当前位置开始数组。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pWriter | 输入 | 非空 | 写入器 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已进入数组 | — |
false | 嵌套超限或状态非法 | xrt.json 域错误 |
xrt.json域错误 — 语法非法、超限或截断(Data 含 offset)
xrtJsonWriterEnd函数
结束最近开始的对象或数组。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pWriter | 输入 | 非空 | 写入器 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 容器已闭合 | — |
false | 无未闭合容器或状态非法 | xrt.json 域错误 |
xrt.json域错误 — 语法非法、超限或截断(Data 含 offset)
xrtJsonWriterName函数
为对象中的下一个值写入名称。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pWriter | 输入 | 非空 | 写入器(对象上下文) |
Name | 输入 | 借用、严格 UTF-8 | 成员名 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已写出 | — |
false | 位置/UTF-8 非法 | xrt.json 域错误 |
xrt.json域错误 — 语法非法、超限或截断(Data 含 offset)
范例已编译验证
data/json · data/json_tour · 写入器 · 观察
!xrtJsonWriterName(pWriter, XRT_STR_LITERAL("code")) ||
xrtJsonWriterNull函数
写入 null。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pWriter | 输入 | 非空 | 写入器 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已写出 | — |
false | 状态非法 | xrt.json 域错误 |
xrt.json域错误 — 语法非法、超限或截断(Data 含 offset)
xrtJsonWriterBool函数
写入布尔值。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pWriter | 输入 | 非空 | 写入器 |
bValue | 输入 | — | 布尔值 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已写出 | — |
false | 状态非法 | xrt.json 域错误 |
xrt.json域错误 — 语法非法、超限或截断(Data 含 offset)
xrtJsonWriterInt函数
写入 int64。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pWriter | 输入 | 非空 | 写入器 |
iValue | 输入 | — | 整数值 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已写出 | — |
false | 状态非法 | xrt.json 域错误 |
xrt.json域错误 — 语法非法、超限或截断(Data 含 offset)
xrtJsonWriterUInt函数
写入 uint64。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pWriter | 输入 | 非空 | 写入器 |
iValue | 输入 | — | 无符号值 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已写出 | — |
false | 状态非法 | xrt.json 域错误 |
xrt.json域错误 — 语法非法、超限或截断(Data 含 offset)
xrtJsonWriterFloat函数
按配置写入 double。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pWriter | 输入 | 非空 | 写入器 |
fValue | 输入 | 有限值 | 浮点值 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已写出 | — |
false | NaN/Inf(严格模式)或状态非法 | xrt.json 域错误 |
xrt.json域错误 — 语法非法、超限或截断(Data 含 offset)
xrtJsonWriterString函数
写入严格 UTF-8 字符串。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pWriter | 输入 | 非空 | 写入器 |
Text | 输入 | 借用、严格 UTF-8 | 字符串 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已转义写出 | — |
false | UTF-8 非法或状态非法 | xrt.json 域错误 |
xrt.json域错误 — 语法非法、超限或截断(Data 含 offset)
范例已编译验证
data/json · data/json_tour · 写入器 · 观察
!xrtJsonWriterString(pWriter, XRT_STR_LITERAL("OK")) ||
xrtJsonWriterValue函数
在当前位置写入完整 Value 子树。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pWriter | 输入 | 非空 | 写入器 |
pValue | 输入 | 非空 | Value 子树 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已递归写出 | — |
false | Value 类型非法或超限 | xrt.json 域错误 |
xrt.json域错误 — 语法非法、超限或截断(Data 含 offset)
xrtJsonWriterFinish函数
验证根值和容器已经完整结束,并封闭写入器。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pWriter | 输入 | 非空 | 写入器 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已封闭(后续只能 Take/Free) | — |
false | 根值缺失或容器未闭合 | xrt.json 域错误 |
xrt.json域错误 — 语法非法、超限或截断(Data 含 offset)
xrtJsonWriterTake函数
从已完成的内存写入器移交文本;结果由 xrtFree 释放。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pWriter | 输入 | 非空、已 Finish | 内存型写入器 |
pSize | 输出 | 可空 | 接收长度 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 零结尾 JSON 文本 | — |
NULL | 未 Finish 或非内存型 | XERR_STATE |
XERR_ARGUMENT— 指针为空或视图非法XERR_STATE— 未 Finish 或回调型写入器
xrtJsonWriterFree函数
释放写入器;空指针是空操作。未 Take 的内存结果一并释放。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pWriter | 输入 | 允许空 | 空 = 空操作 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 无 | 写入器与内部缓冲已释放 | — |
- 无 — 释放不失败
xrtJsonWriteConfigInit函数
初始化紧凑输出、严格类型和有限输出预算的写入配置。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pConfig | 输出 | 非空 | 接收默认配置 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 无 | 纯初始化 | — |
- 无
xrtJsonStringify函数
紧凑或美化地序列化 Value,并返回由 xrtFree 释放的字符串。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pValue | 输入 | 非空 | Value 树 |
bPretty | 输入 | — | 缩进美化 |
pSize | 输出 | 可空 | 接收长度 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 零结尾 JSON 文本 | — |
NULL | 类型非法或 OOM | xrt.json 域错误 |
xrt.json域错误 — 语法非法、超限或截断(Data 含 offset)XERR_MEMORY
xrtJsonWrite函数
使用高级配置把 Value 同步写入调用方输出回调。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pValue | 输入 | 非空 | Value 树 |
pConfig | 输入 | 允许空 | 写入配置 |
pWrite | 输入 | 非空 | 输出回调 |
pUserData | 输入 | 任意值 | 回调数据 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已完整写出 | — |
false | 类型非法、超限或回调中止 | xrt.json 域错误 |
xrt.json域错误 — 语法非法、超限或截断(Data 含 offset)
范例已编译验证
data/json_tour · data/json_tour · 序列化 · 观察
if ( !xrtJsonWrite(pDom, &WriteConfig, exampleCollect, &Sink) ||
(Sink.Size != sizeof(sText) - 1u) ||
(memcmp(Sink.Buffer, sText,
sizeof(sText) - 1u) != 0) ) {
xrtJsonQuoteWrite函数
严格校验 UTF-8 并流式写出包含双引号的 JSON 字符串 token。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Text | 输入 | 借用、严格 UTF-8 | 原始字符串 |
iFlags | 输入 | XJSON_WRITE_* | 转义标志 |
pWrite | 输入 | 非空 | 输出回调 |
pUserData | 输入 | 任意值 | 回调数据 |
pWritten | 输出 | 可空 | 写出字节数 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已流式写出(含首尾引号) | — |
false | UTF-8 非法或回调失败 | xrt.json 域错误 |
xrt.json域错误 — 语法非法、超限或截断(Data 含 offset)
范例已编译验证
data/json_tour · data/json_tour · 转义 · 观察
if ( !xrtJsonQuoteWrite(SV("a\"b\\c"), 0u, exampleCollect,
&Sink, &iWritten) ||
(Sink.Size != 9u) || /* 带引号转义 "a\"b\\c" 共 9 字节 */
(memcmp(Sink.Buffer, "\"a\\\"b\\\\c\"", 9u) != 0) ) {
xrtJsonParseFile函数
使用默认严格配置读取并解析 JSON 文件。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
sPath | 输入 | 非空、UTF-8 | 文件路径 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 拥有的 Value DOM | — |
NULL | 读取或解析失败 | xrt.io / xrt.json 域错误 |
xrt.io域错误 — 文件读取失败- -
xrt.json域错误 — 语法非法、超限或截断(Data 含 offset) XERR_MEMORY
xrtJsonReadFile函数
使用读取配置和其中的输入上限解析 JSON 文件。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
sPath | 输入 | 非空 | 文件路径 |
pConfig | 输入 | 允许空 | 含 InputLimit |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | Value DOM | — |
NULL | 失败 | 域错误 |
xrt.io/xrt.json域错误 /XERR_MEMORY
xrtJsonWriteFile函数
使用高级配置序列化并原子替换 JSON 文件。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
sPath | 输入 | 非空 | 目标路径 |
pValue | 输入 | 非空 | Value 树 |
pConfig | 输入 | 允许空 | 写入配置 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已原子发布 | — |
false | 序列化或写入失败 | 域错误 |
xrt.json/xrt.io域错误
范例已编译验证
data/json_tour · data/json_tour · 文件 · 观察
if ( !xrtJsonWriteFile(sFile, pDom, &WriteConfig) ||
((pInner = xrtJsonParseFile(sFile)) == NULL) ) {
xrtJsonStringifyFile函数
紧凑或美化地序列化并原子替换 JSON 文件。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
sPath | 输入 | 非空 | 目标路径 |
pValue | 输入 | 非空 | Value 树 |
bPretty | 输入 | — | 缩进美化 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已原子发布 | — |
false | 序列化或写入失败 | 域错误 |
xrt.json/xrt.io域错误
常量索引常量
以下常量在本页所属头文件中定义,语义见公共头注释。
| 常量 | 说明 |
|---|---|
| XJSON_BIGINT_FLOAT | 见头文件注释 |
| XJSON_BIGINT_REJECT | 见头文件注释 |
| XJSON_CONTAINER_DEFAULT | 见头文件注释 |
| XJSON_DEPTH_DEFAULT | 见头文件注释 |
| XJSON_DUPLICATE_KEEP | 见头文件注释 |
| XJSON_DUPLICATE_REJECT | 见头文件注释 |
| XJSON_DUPLICATE_REPLACE | 见头文件注释 |
| XJSON_ERROR_CONFIG | 见头文件注释 |
| XJSON_ERROR_DUPLICATE | 见头文件注释 |
| XJSON_ERROR_IO | 见头文件注释 |
| XJSON_ERROR_LIMIT | 见头文件注释 |
| XJSON_ERROR_NUMBER | 见头文件注释 |
| XJSON_ERROR_OUTPUT | 见头文件注释 |
| XJSON_ERROR_STATE | 见头文件注释 |
| XJSON_ERROR_SYNTAX | 见头文件注释 |
| XJSON_ERROR_UNSUPPORTED | 见头文件注释 |
| XJSON_EVENT_ARRAY_BEGIN | 见头文件注释 |
| XJSON_EVENT_ARRAY_END | 见头文件注释 |
| XJSON_EVENT_BOOL | 见头文件注释 |
| XJSON_EVENT_FLOAT | 见头文件注释 |
| XJSON_EVENT_INT | 见头文件注释 |
| XJSON_EVENT_NULL | 见头文件注释 |
| XJSON_EVENT_OBJECT_BEGIN | 见头文件注释 |
| XJSON_EVENT_OBJECT_END | 见头文件注释 |
| XJSON_EVENT_STRING | 见头文件注释 |
| XJSON_EVENT_UINT | 见头文件注释 |
| XJSON_INPUT_DEFAULT | 见头文件注释 |
| XJSON_NONFINITE_NULL | 见头文件注释 |
| XJSON_NONFINITE_REJECT | 见头文件注释 |
| XJSON_NONFINITE_STRING | 见头文件注释 |
| XJSON_READ_COMMENTS | 见头文件注释 |
| XJSON_READ_TRAILING_COMMA | 见头文件注释 |
| XJSON_STRING_DEFAULT | 见头文件注释 |
| XJSON_UNSUPPORTED_NULL | 见头文件注释 |
| XJSON_UNSUPPORTED_REJECT | 见头文件注释 |
| XJSON_UNSUPPORTED_SKIP | 见头文件注释 |
| XJSON_VALUES_DEFAULT | 见头文件注释 |
| XJSON_VISIT_DONE | 见头文件注释 |
| XJSON_VISIT_ERROR | 见头文件注释 |
| XJSON_VISIT_FAIL | 见头文件注释 |
| XJSON_VISIT_NEXT | 见头文件注释 |
| XJSON_VISIT_STOP | 见头文件注释 |
| XJSON_VISIT_STOPPED | 见头文件注释 |
| XJSON_WRITE_CONTAINER_COMPAT | 见头文件注释 |
| XJSON_WRITE_ESCAPE_HTML | 见头文件注释 |
| XJSON_WRITE_ESCAPE_NON_ASCII | 见头文件注释 |
| XJSON_WRITE_ESCAPE_SLASH | 见头文件注释 |
| XJSON_WRITE_PRETTY | 见头文件注释 |