模块

std.json

验证、令牌计数、显式分配器解析和调用者缓冲区字符串写入。

状态

当前可运行:

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)usizeSpan<u8> 载荷计算流式令牌数。
std.json.writeString(buffer, text)Maybe<String>将转义后的 JSON 字符串写入调用者存储。
std.json.decodeBoundary()String记录当前元数据暴露的类型化解码边界。

元数据标签:

  • 副作用:parse 或 alloc
  • 分配行为:验证和流式处理无需分配;parse 仅使用显式分配器;writeString 写入调用者缓冲区
  • 目标支持:与目标无关
  • 错误行为:Maybe 辅助函数失败时返回 null
  • 所有权说明:在当前编译器切片中,解析后的文档由显式分配器存储拥有
  • 示例:examples/std-data-formats.0examples/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 子集。