Jsonptr:使用 Wuffs 的内存安全、零分配 JSON 解码器

主要观点jsonptr是一个新的沙盒化命令行工具,可格式化 JSON 并使用 JSON Pointer 查询语法。它在速度、内存使用和安全性方面优于jqserde_jsonsimdjson等工具。
关键信息

  • jsonptr是 C++编写的 JSON 工具,基于 Wuffs 库,Wuffs 是一种内存安全的语言。
  • 它能处理任意长的输入,使用多个令牌表示 JSON 字符串,在解析过程中处理 JSON Pointer 查询可显著影响性能。
  • jsonptr具有速度快、内存使用少(零动态分配)、安全(在SECCOMP_MODE_STRICT沙盒中运行)等优点。
  • jq相比,jsonptr不排序对象键,需要O(1)内存;不将 JSON 数字从字符串转换为数字,避免了StringToDouble的冗余转换。
  • Wuffs 的解码器基于缓冲区和协程,处理任意长的输入和输出,每个 JSON 字符串由多个 Wuffs 令牌表示。
  • jsonptr的 C++程序通过四个例程连接字节或令牌缓冲区,实现 JSON 的处理和渲染,维护一个光标索引来跟踪解析状态。
  • Wuffs 还提供了更高级的 C++ API,jsonfindptrs示例程序使用该 API 进行更传统的 JSON 解码和处理。
  • simdjson声称是最快的 JSON 解析器,但不安全,其最小化 API 需提供足够大的输出缓冲区,且没有格式化 API。
  • jsonptr在处理特定 JSON Pointer 查询时比simdjsonserde_json快很多,因为它在解析过程中应用 JSON Pointer 过滤器。
    重要细节
  • 在 Linux 上,jsonptrmain函数会自我施加SECCOMP_MODE_STRICT沙盒,限制程序只能从输入文件读取、计算并写入stdout
  • Wuffs 令牌是uint64_t值,包含令牌长度、是否连续等信息,用于表示 JSON 数据。
  • jsonptr的四个例程协同调度,通常在输入耗尽或输出满时 yield。
  • 不同语言的 JSON 格式化工具在性能和功能上各有特点,如 Python 的json.tool、Go 的encoding/json、C++的nlohmann/jsonrapidjson等。
阅读 16
0 条评论