模块契约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_COREXRT_FEATURE_JSON_COREcore
校验、事件访问、DOM 解析XRT_MODULE_JSON_READXRT_FEATURE_JSON_READjson_core, buffer, number, unicode, value_container
DOM 与增量写出XRT_MODULE_JSON_WRITEXRT_FEATURE_JSON_WRITEjson_core, buffer, number, unicode, value_container
JSON 文件读写XRT_MODULE_JSON_FILEXRT_FEATURE_JSON_FILEjson_read, json_write, file_whole
完整 JSONXRT_MODULE_JSONXRT_FEATURE_JSONjson_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();失败返回 C NULL,两者没有歧义。
  • 整数字面量优先保存为 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写出失败
typedef enum xjsonerror { XJSON_ERROR_CONFIG = 1301, XJSON_ERROR_SYNTAX, XJSON_ERROR_LIMIT, XJSON_ERROR_DUPLICATE, XJSON_ERROR_NUMBER, XJSON_ERROR_STATE, XJSON_ERROR_UNSUPPORTED, XJSON_ERROR_OUTPUT, XJSON_ERROR_IO } xjsonerror;

xjsonlocation类型

文本位置使用零基字节偏移和一基行列;列按 UTF-8 字节计算。

字段类型语义
Offsetsize_t偏移量
Linesize_t行号
Columnsize_t列号
typedef struct xjsonlocation { size_t Offset; size_t Line; size_t Column; } xjsonlocation;

xjsonreadflag类型

非标准读取能力默认全部关闭,只能由调用方逐项开启。

值语义
XJSON_READ_COMMENTSXJSON读方向COMMENTS
XJSON_READ_TRAILING_COMMA允许尾随逗号
typedef enum xjsonreadflag { XJSON_READ_COMMENTS = UINT32_C(0x00000001), XJSON_READ_TRAILING_COMMA = UINT32_C(0x00000002)

xjsonduplicate类型

对象重复键必须由 DOM 调用方明确选择处理口径。

值语义
XJSON_DUPLICATE_REJECTREJECT
XJSON_DUPLICATE_KEEPKEEP
XJSON_DUPLICATE_REPLACE重名成员后者覆盖
typedef enum xjsonduplicate { XJSON_DUPLICATE_REJECT = 0, XJSON_DUPLICATE_KEEP, XJSON_DUPLICATE_REPLACE } xjsonduplicate;

xjsonbigint类型

超出 int64/uint64 的整数字面量默认失败,显式浮点策略允许有损接收。

值语义
XJSON_BIGINT_REJECTXJSONBIGINTREJECT
XJSON_BIGINT_FLOAT浮点形态(超精度可选)
typedef enum xjsonbigint { XJSON_BIGINT_REJECT = 0, XJSON_BIGINT_FLOAT } xjsonbigint;

xjsonreadconfig类型

JSON 读取配置同时约束资源消耗和少量显式兼容语法。

字段类型语义
Flagsuint32标志位
DuplicatexjsonduplicateDuplicate
BigIntegerxjsonbigintBigInteger
MaxDepthuint32MaxDepth
MaxInputBytessize_tMaxInputBytes
MaxStringBytessize_tMaxStringBytes
MaxValuessize_tMaxValues
MaxContainerItemssize_tMaxContainerItems
typedef struct xjsonreadconfig { uint32 Flags; xjsonduplicate Duplicate; xjsonbigint BigInteger; uint32 MaxDepth; size_t MaxInputBytes; size_t MaxStringBytes; size_t MaxValues; size_t MaxContainerItems; uint32 Reserved[4]; } xjsonreadconfig;

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无符号整数事件
typedef enum xjsoneventtype { XJSON_EVENT_NULL = 0, XJSON_EVENT_BOOL, XJSON_EVENT_INT, XJSON_EVENT_FLOAT, XJSON_EVENT_STRING, XJSON_EVENT_ARRAY_BEGIN, XJSON_EVENT_ARRAY_END, XJSON_EVENT_OBJECT_BEGIN, XJSON_EVENT_OBJECT_END, XJSON_EVENT_UINT } xjsoneventtype;

xjsonvisitaction类型

回调可继续、正常提前停止或报告失败。

值语义
XJSON_VISIT_NEXTNEXT
XJSON_VISIT_STOPSTOP
XJSON_VISIT_FAIL回调失败
typedef enum xjsonvisitaction { XJSON_VISIT_NEXT = 0, XJSON_VISIT_STOP, XJSON_VISIT_FAIL } xjsonvisitaction;

xjsonvisitresult类型

访问结果明确区分完整完成、调用方停止和解析失败。

值语义
XJSON_VISIT_ERROR失败
XJSON_VISIT_DONE完成
XJSON_VISIT_STOPPED回调请求停止
typedef enum xjsonvisitresult { XJSON_VISIT_ERROR = -1, XJSON_VISIT_DONE = 0, XJSON_VISIT_STOPPED = 1 } xjsonvisitresult;

xjsonwriteflag类型

输出标志只改变文本表示,不改变 Value 数据。

值语义
XJSON_WRITE_PRETTY写方向
XJSON_WRITE_ESCAPE_SLASH写方向
XJSON_WRITE_ESCAPE_HTML写方向
XJSON_WRITE_ESCAPE_NON_ASCII写方向
XJSON_WRITE_CONTAINER_COMPAT容器兼容模式
typedef enum xjsonwriteflag { XJSON_WRITE_PRETTY = UINT32_C(0x00000001), XJSON_WRITE_ESCAPE_SLASH = UINT32_C(0x00000002), XJSON_WRITE_ESCAPE_HTML = UINT32_C(0x00000004), XJSON_WRITE_ESCAPE_NON_ASCII = UINT32_C(0x00000008), XJSON_WRITE_CONTAINER_COMPAT = UINT32_C(0x00000010)

xjsonnonfinite类型

非有限浮点默认失败,也可显式写成 null 或字符串。

值语义
XJSON_NONFINITE_REJECTREJECT
XJSON_NONFINITE_NULL空值
XJSON_NONFINITE_STRING字符串表示
typedef enum xjsonnonfinite { XJSON_NONFINITE_REJECT = 0, XJSON_NONFINITE_NULL, XJSON_NONFINITE_STRING } xjsonnonfinite;

xjsonunsupported类型

不受 JSON 表达的 Value 默认失败,也可显式写 null 或跳过成员。

值语义
XJSON_UNSUPPORTED_REJECT不支持
XJSON_UNSUPPORTED_NULL空值
XJSON_UNSUPPORTED_SKIP跳过
typedef enum xjsonunsupported { XJSON_UNSUPPORTED_REJECT = 0, XJSON_UNSUPPORTED_NULL, XJSON_UNSUPPORTED_SKIP } xjsonunsupported;

xjsonwriteconfig类型

JSON 写出配置提供固定上限;Indent 只在美化输出时生效。

字段类型语义
Flagsuint32标志位
NonFinitexjsonnonfiniteNonFinite
UnsupportedxjsonunsupportedUnsupported
MaxDepthuint32MaxDepth
Indentuint32Indent
MaxOutputBytessize_tMaxOutputBytes
typedef struct xjsonwriteconfig { uint32 Flags; xjsonnonfinite NonFinite; xjsonunsupported Unsupported; uint32 MaxDepth; uint32 Indent; size_t MaxOutputBytes; uint32 Reserved[4]; } xjsonwriteconfig;

xjsonwriter类型

增量写入器保持不透明,写入方法不可从输出回调重入。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。

typedef struct xjsonwriter xjsonwriter;

xjsonvisitproc类型

JSON 访问器不得保存事件中的借用视图,失败时应设置更具体的错误。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef xjsonvisitaction(*xjsonvisitproc)( const xjsonevent* pEvent, ptr pUserData)

xjsonwriteproc类型

输出回调必须在返回前消费借用字节,失败时应设置具体错误。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef bool(*xjsonwriteproc)(xbytesview Data, ptr pUserData)

xrtJsonReadConfigInit函数

初始化严格 JSON、重复键拒绝和有限资源预算的读取配置。

void xrtJsonReadConfigInit(xjsonreadconfig* pConfig)

参数

参数方向约束说明
pConfig输出非空接收默认配置
返回值
返回含义失败时状态
无纯初始化—
错误
  • 无

范例已编译验证

data/json · data/json_tour · 读取 · 观察

	xrtJsonReadConfigInit(&ReadConfig);

xrtJsonParse函数

使用默认严格配置解析一个完整 JSON 文本。

xvalue* xrtJsonParse(xstrview Text)

参数

参数方向约束说明
Text输入借用、严格 UTF-8完整 JSON 文本
返回值
返回含义失败时状态
非空拥有的 Value DOM(xvalue 族操作/释放)—
NULL语法错误、超限或 OOMxrt.json 域错误
错误
  • xrt.json 域错误 — 语法非法、超限或截断(Data 含 offset)
  • XERR_MEMORY

范例已编译验证

data/json · data/json · 解析 · 观察

	pRoot = xrtJsonParse(XRT_STR_LITERAL(
		"{\"name\":\"xrt\",\"features\":[\"json\",\"http\"]}"
	));

xrtJsonRead函数

使用高级配置解析一个完整 JSON 文本。

xvalue* xrtJsonRead(xstrview Text, const xjsonreadconfig* pConfig)

参数

参数方向约束说明
Text输入借用完整 JSON 文本
pConfig输入允许空空 = 默认严格配置
返回值
返回含义失败时状态
非空拥有的 Value DOM—
NULL失败xrt.json 域错误
错误
  • xrt.json 域错误 — 语法非法、超限或截断(Data 含 offset)
  • XERR_MEMORY

范例已编译验证

data/json_tour · data/json_tour · 读取 · 观察

	pDom = xrtJsonRead(SV(sText), &ReadConfig);

xrtJsonValid函数

使用默认严格配置验证一个完整 JSON 文本,不构造 Value DOM。

bool xrtJsonValid(xstrview Text)

参数

参数方向约束说明
Text输入借用待验证文本
返回值
返回含义失败时状态
true合法 JSON—
false非法xrt.json 域错误
错误
  • xrt.json 域错误 — 语法非法、超限或截断(Data 含 offset)

范例已编译验证

data/json_tour · data/json_tour · 验证 · 观察

		!xrtJsonValid(SV(sText)) ||

xrtJsonVisit函数

直接访问解析事件,不构造中间 DOM。

xjsonvisitresult xrtJsonVisit(xstrview Text, const xjsonreadconfig* pConfig, xjsonvisitproc pVisitor, ptr pUserData)

参数

参数方向约束说明
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 错误的机器数据中读取文本位置。

bool xrtJsonErrorLocation(const xerror* pError, xjsonlocation* pLocation)

参数

参数方向约束说明
pError输入非空、xrt.json 域解析错误
pLocation输出非空接收 Line/Column
返回值
返回含义失败时状态
true位置已写出—
false错误不带位置数据或参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或视图非法

范例已编译验证

data/json_tour · data/report · 错误定位 · 观察

			!xrtJsonErrorLocation(pError, &Location) ||

xrtJsonWriterCreate函数

创建把增量结果保存在内存中的 JSON 写入器。

xjsonwriter* xrtJsonWriterCreate(const xjsonwriteconfig* pConfig)

参数

参数方向约束说明
pConfig输入允许空空 = WriteConfigInit 默认
返回值
返回含义失败时状态
非空内存型写入器—
NULL参数错误或 OOMXERR_ARGUMENT / XERR_MEMORY
错误
  • XERR_ARGUMENT — 指针为空或视图非法
  • XERR_MEMORY

范例已编译验证

data/json · data/json_tour · 写入器 · 观察

	pWriter = xrtJsonWriterCreate(&WriteConfig);

xrtJsonWriterCreateSink函数

创建把增量结果同步提交给回调的 JSON 写入器。

xjsonwriter* xrtJsonWriterCreateSink(const xjsonwriteconfig* pConfig, xjsonwriteproc pWrite, ptr pUserData)

参数

参数方向约束说明
pConfig输入允许空输出配置
pWrite输入非空输出回调(返回前消费字节)
pUserData输入任意值回调数据
返回值
返回含义失败时状态
非空回调型写入器—
NULL参数错误或 OOM—
错误
  • XERR_ARGUMENT — 指针为空或视图非法
  • XERR_MEMORY

范例已编译验证

data/json_tour · data/json_tour · 写入器 · 观察

	pWriter = xrtJsonWriterCreateSink(&WriteConfig, exampleCollect,
		&Sink);

xrtJsonWriterObject函数

在当前位置开始对象;对象中必须先写 Name,数组中直接写值。

bool xrtJsonWriterObject(xjsonwriter* pWriter)

参数

参数方向约束说明
pWriter输入非空写入器
返回值
返回含义失败时状态
true已进入对象—
false嵌套超限或状态非法xrt.json 域错误
错误
  • xrt.json 域错误 — 语法非法、超限或截断(Data 含 offset)

范例已编译验证

data/json · data/json_tour · 写入器 · 观察

		!xrtJsonWriterObject(pWriter) ||                     /* 开对象 */

xrtJsonWriterArray函数

在当前位置开始数组。

bool xrtJsonWriterArray(xjsonwriter* pWriter)

参数

参数方向约束说明
pWriter输入非空写入器
返回值
返回含义失败时状态
true已进入数组—
false嵌套超限或状态非法xrt.json 域错误
错误
  • xrt.json 域错误 — 语法非法、超限或截断(Data 含 offset)

范例已编译验证

data/json_tour · data/json_tour · 写入器 · 观察

		!xrtJsonWriterArray(pWriter) ||

xrtJsonWriterEnd函数

结束最近开始的对象或数组。

bool xrtJsonWriterEnd(xjsonwriter* pWriter)

参数

参数方向约束说明
pWriter输入非空写入器
返回值
返回含义失败时状态
true容器已闭合—
false无未闭合容器或状态非法xrt.json 域错误
错误
  • xrt.json 域错误 — 语法非法、超限或截断(Data 含 offset)

范例已编译验证

data/json · data/json_tour · 写入器 · 观察

		!xrtJsonWriterEnd(pWriter) ||                       /* 闭对象 */

xrtJsonWriterName函数

为对象中的下一个值写入名称。

bool xrtJsonWriterName(xjsonwriter* pWriter, xstrview Name)

参数

参数方向约束说明
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。

bool xrtJsonWriterNull(xjsonwriter* pWriter)

参数

参数方向约束说明
pWriter输入非空写入器
返回值
返回含义失败时状态
true已写出—
false状态非法xrt.json 域错误
错误
  • xrt.json 域错误 — 语法非法、超限或截断(Data 含 offset)

范例已编译验证

data/json_tour · data/json_tour · 写入器 · 观察

		!xrtJsonWriterNull(pWriter) ||

xrtJsonWriterBool函数

写入布尔值。

bool xrtJsonWriterBool(xjsonwriter* pWriter, bool bValue)

参数

参数方向约束说明
pWriter输入非空写入器
bValue输入—布尔值
返回值
返回含义失败时状态
true已写出—
false状态非法xrt.json 域错误
错误
  • xrt.json 域错误 — 语法非法、超限或截断(Data 含 offset)

范例已编译验证

data/json_tour · data/json_tour · 写入器 · 观察

		!xrtJsonWriterBool(pWriter, true) ||

xrtJsonWriterInt函数

写入 int64。

bool xrtJsonWriterInt(xjsonwriter* pWriter, int64 iValue)

参数

参数方向约束说明
pWriter输入非空写入器
iValue输入—整数值
返回值
返回含义失败时状态
true已写出—
false状态非法xrt.json 域错误
错误
  • xrt.json 域错误 — 语法非法、超限或截断(Data 含 offset)

范例已编译验证

data/json · data/json_tour · 写入器 · 观察

		!xrtJsonWriterInt(pWriter, 200) ||

xrtJsonWriterUInt函数

写入 uint64。

bool xrtJsonWriterUInt(xjsonwriter* pWriter, uint64 iValue)

参数

参数方向约束说明
pWriter输入非空写入器
iValue输入—无符号值
返回值
返回含义失败时状态
true已写出—
false状态非法xrt.json 域错误
错误
  • xrt.json 域错误 — 语法非法、超限或截断(Data 含 offset)

范例已编译验证

data/json_tour · data/json_tour · 写入器 · 观察

		!xrtJsonWriterUInt(pWriter, 1u) ||

xrtJsonWriterFloat函数

按配置写入 double。

bool xrtJsonWriterFloat(xjsonwriter* pWriter, double fValue)

参数

参数方向约束说明
pWriter输入非空写入器
fValue输入有限值浮点值
返回值
返回含义失败时状态
true已写出—
falseNaN/Inf(严格模式)或状态非法xrt.json 域错误
错误
  • xrt.json 域错误 — 语法非法、超限或截断(Data 含 offset)

范例已编译验证

data/json_tour · data/json_tour · 写入器 · 观察

		!xrtJsonWriterFloat(pWriter, 2.5) ) {

xrtJsonWriterString函数

写入严格 UTF-8 字符串。

bool xrtJsonWriterString(xjsonwriter* pWriter, xstrview Text)

参数

参数方向约束说明
pWriter输入非空写入器
Text输入借用、严格 UTF-8字符串
返回值
返回含义失败时状态
true已转义写出—
falseUTF-8 非法或状态非法xrt.json 域错误
错误
  • xrt.json 域错误 — 语法非法、超限或截断(Data 含 offset)

范例已编译验证

data/json · data/json_tour · 写入器 · 观察

		!xrtJsonWriterString(pWriter, XRT_STR_LITERAL("OK")) ||

xrtJsonWriterValue函数

在当前位置写入完整 Value 子树。

bool xrtJsonWriterValue(xjsonwriter* pWriter, const xvalue* pValue)

参数

参数方向约束说明
pWriter输入非空写入器
pValue输入非空Value 子树
返回值
返回含义失败时状态
true已递归写出—
falseValue 类型非法或超限xrt.json 域错误
错误
  • xrt.json 域错误 — 语法非法、超限或截断(Data 含 offset)

范例已编译验证

data/json_tour · data/json_tour · 写入器 · 观察

		!xrtJsonWriterValue(pWriter, pInner) ||

xrtJsonWriterFinish函数

验证根值和容器已经完整结束,并封闭写入器。

bool xrtJsonWriterFinish(xjsonwriter* pWriter)

参数

参数方向约束说明
pWriter输入非空写入器
返回值
返回含义失败时状态
true已封闭(后续只能 Take/Free)—
false根值缺失或容器未闭合xrt.json 域错误
错误
  • xrt.json 域错误 — 语法非法、超限或截断(Data 含 offset)

范例已编译验证

data/json · data/json_tour · 写入器 · 观察

		!xrtJsonWriterFinish(pWriter)                       /* 完整性校验 */

xrtJsonWriterTake函数

从已完成的内存写入器移交文本;结果由 xrtFree 释放。

str xrtJsonWriterTake(xjsonwriter* pWriter, size_t* pSize)

参数

参数方向约束说明
pWriter输入非空、已 Finish内存型写入器
pSize输出可空接收长度
返回值
返回含义失败时状态
非空零结尾 JSON 文本—
NULL未 Finish 或非内存型XERR_STATE
错误
  • XERR_ARGUMENT — 指针为空或视图非法
  • XERR_STATE — 未 Finish 或回调型写入器

范例已编译验证

data/json · data/json_tour · 写入器 · 观察

	sText = xrtJsonWriterTake(pWriter, &iSize);

xrtJsonWriterFree函数

释放写入器;空指针是空操作。未 Take 的内存结果一并释放。

void xrtJsonWriterFree(xjsonwriter* pWriter)

参数

参数方向约束说明
pWriter输入允许空空 = 空操作
返回值
返回含义失败时状态
无写入器与内部缓冲已释放—
错误
  • 无 — 释放不失败

范例已编译验证

data/json · data/json_tour · 写入器 · 观察

		xrtJsonWriterFree(pWriter);

xrtJsonWriteConfigInit函数

初始化紧凑输出、严格类型和有限输出预算的写入配置。

void xrtJsonWriteConfigInit(xjsonwriteconfig* pConfig)

参数

参数方向约束说明
pConfig输出非空接收默认配置
返回值
返回含义失败时状态
无纯初始化—
错误
  • 无

范例已编译验证

data/json · data/json_tour · 序列化 · 观察

	xrtJsonWriteConfigInit(&WriteConfig);

xrtJsonStringify函数

紧凑或美化地序列化 Value,并返回由 xrtFree 释放的字符串。

str xrtJsonStringify(const xvalue* pValue, bool bPretty, size_t* pSize)

参数

参数方向约束说明
pValue输入非空Value 树
bPretty输入—缩进美化
pSize输出可空接收长度
返回值
返回含义失败时状态
非空零结尾 JSON 文本—
NULL类型非法或 OOMxrt.json 域错误
错误
  • xrt.json 域错误 — 语法非法、超限或截断(Data 含 offset)
  • XERR_MEMORY

范例已编译验证

data/json · data/json · 序列化 · 观察

	sText = xrtJsonStringify(pRoot, true, &iSize);

xrtJsonWrite函数

使用高级配置把 Value 同步写入调用方输出回调。

bool xrtJsonWrite(const xvalue* pValue, const xjsonwriteconfig* pConfig, xjsonwriteproc pWrite, ptr pUserData)

参数

参数方向约束说明
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。

bool xrtJsonQuoteWrite(xstrview Text, uint32 iFlags, xjsonwriteproc pWrite, ptr pUserData, size_t* pWritten)

参数

参数方向约束说明
Text输入借用、严格 UTF-8原始字符串
iFlags输入XJSON_WRITE_*转义标志
pWrite输入非空输出回调
pUserData输入任意值回调数据
pWritten输出可空写出字节数
返回值
返回含义失败时状态
true已流式写出(含首尾引号)—
falseUTF-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 文件。

xvalue* xrtJsonParseFile(cstr sPath)

参数

参数方向约束说明
sPath输入非空、UTF-8文件路径
返回值
返回含义失败时状态
非空拥有的 Value DOM—
NULL读取或解析失败xrt.io / xrt.json 域错误
错误
  • xrt.io 域错误 — 文件读取失败
  • - xrt.json 域错误 — 语法非法、超限或截断(Data 含 offset)
  • XERR_MEMORY

范例已编译验证

data/json_tour · data/json · 文件 · 观察

	pFileDom = xrtJsonParseFile(sFile);

xrtJsonReadFile函数

使用读取配置和其中的输入上限解析 JSON 文件。

xvalue* xrtJsonReadFile(cstr sPath, const xjsonreadconfig* pConfig)

参数

参数方向约束说明
sPath输入非空文件路径
pConfig输入允许空含 InputLimit
返回值
返回含义失败时状态
非空Value DOM—
NULL失败域错误
错误
  • xrt.io / xrt.json 域错误 / XERR_MEMORY

范例已编译验证

data/json_tour · data/json_tour · 文件 · 观察

	pReadDom = xrtJsonReadFile(sFile, &ReadConfig);

xrtJsonWriteFile函数

使用高级配置序列化并原子替换 JSON 文件。

bool xrtJsonWriteFile(cstr sPath, const xvalue* pValue, const xjsonwriteconfig* pConfig)

参数

参数方向约束说明
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 文件。

bool xrtJsonStringifyFile(cstr sPath, const xvalue* pValue, bool bPretty)

参数

参数方向约束说明
sPath输入非空目标路径
pValue输入非空Value 树
bPretty输入—缩进美化
返回值
返回含义失败时状态
true已原子发布—
false序列化或写入失败域错误
错误
  • xrt.json / xrt.io 域错误

范例已编译验证

data/json_tour · data/json · 文件 · 观察

	if ( !xrtJsonStringifyFile(sFile, pDom, true) ) {

常量索引常量

以下常量在本页所属头文件中定义,语义见公共头注释。

常量说明
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见头文件注释