状态
当前可运行:
| API | 返回值 | 说明 |
|---|---|---|
std.json.validate(text) | Bool | 检查当前 JSON 子集,不进行分配。 |
std.json.validateBytes(bytes) | Bool | 检查 Span<u8> JSON 载荷,不进行分配。 |
std.json.parse(alloc, text) | Maybe<JsonDoc> | 使用显式分配器解析,失败时返回 null。 |
std.json.parseBytes(alloc, bytes) | Maybe<JsonDoc> | 使用显式分配器解析 Span<u8> 载荷,失败时返回 null。 |
std.json.streamTokens(text) | usize | 计算流式令牌数,不构建拥有的树。 |
std.json.streamTokensBytes(bytes) | usize | 从 Span<u8> 载荷计算流式令牌数。 |
std.json.writeString(buffer, text) | Maybe<String> | 将转义后的 JSON 字符串写入调用者存储。 |
std.json.decodeBoundary() | String | 记录当前元数据暴露的类型化解码边界。 |
元数据标签:
- 副作用:parse 或 alloc
- 分配行为:验证和流式处理无需分配;parse 仅使用显式分配器;writeString 写入调用者缓冲区
- 目标支持:与目标无关
- 错误行为:
Maybe辅助函数失败时返回 null - 所有权说明:在当前编译器切片中,解析后的文档由显式分配器存储拥有
- 示例:
examples/std-data-formats.0、examples/std-json-bytes.0
示例
pub fn main Void world World ! mut arena_buf [16]u8 [0_u8;16] mut arena std.mem.fixedBufAlloc arena_buf let parsed std.json.parse arena "{\"ok\":true}" mut out [16]u8 [0_u8;16] let text std.json.writeString out "zero" if && (&& parsed.has text.has) (== (std.json.streamTokens "{\"ok\":true}") 3) check world.out.write "json ok\n"字节跨度解析形式:
pub fn main Void world World ! let bytes std.mem.span "{\"ok\":1}" mut arena_buf [16]u8 [0_u8;16] mut arena std.mem.fixedBufAlloc arena_buf let parsed std.json.parseBytes arena bytes if && (&& parsed.has (std.json.validateBytes bytes)) (== (std.json.streamTokensBytes bytes) 3) check world.out.write "json bytes ok\n" ret check world.err.write "json bytes failed\n"设计说明
JSON 不应伪装成无分配语义。验证和流式处理保持无分配。
解析为拥有的文档需要显式分配器。当前 JsonDoc 值是不透明的;示例通过检查 Maybe.has 并使用令牌流式处理来实现无分配的摘要。字符串和字节跨度的入口点共享相同的 JSON 子集。