特点

总体

  • 跨平台
    • 编译器:Visual Studio、gcc、clang 等
    • 架构:x86、x64、ARM 等
    • 操作系统:Windows、Mac OS X、Linux、iOS、Android 等
  • 容易安装
    • 只有头文件的库。只需把头文件复制至你的项目中。
  • 独立、最小依赖
    • 不需依赖 STL、BOOST 等。
    • 只包含 <cstdio>, <cstdlib>, <cstring>, <inttypes.h>, <new>, <stdint.h>
  • 没使用 C++ 异常、RTTI
  • 高性能
    • 使用模版及内联函数去降低函数调用开销。
    • 内部经优化的 Grisu2 及浮点数解析实现。
    • 可选的 SSE2/SSE4.2 支持。

符合标准

  • RapidJSON 应完全符合 RFC4627/ECMA-404 标准。
  • 支持 JSON Pointer (RFC6901).
  • 支持 JSON Schema Draft v4.
  • 支持 Unicode 代理对(surrogate pair)。
  • 支持空字符("\u0000")。
    • 例如,可以优雅地解析及处理 ["Hello\u0000World"]。含读写字符串长度的 API。
  • 支持可选的放宽语法
    • 单行(// ...)及多行(/* ... *‍/) 注释 (kParseCommentsFlag)。
    • 在对象和数组结束前含逗号 (kParseTrailingCommasFlag)。
    • NaNInfInfinity-Inf-Infinity 作为 double 值 (kParseNanAndInfFlag)
  • NPM 兼容.

Unicode

  • 支持 UTF-8、UTF-16、UTF-32 编码,包括小端序和大端序。
    • 这些编码用于输入输出流,以及内存中的表示。
  • 支持从输入流自动检测编码。
  • 内部支持编码的转换。
    • 例如,你可以读取一个 UTF-8 文件,让 RapidJSON 把 JSON 字符串转换至 UTF-16 的 DOM。
  • 内部支持编码校验。
    • 例如,你可以读取一个 UTF-8 文件,让 RapidJSON 检查是否所有 JSON 字符串是合法的 UTF-8 字节序列。
  • 支持自定义的字符类型。
    • 预设的字符类型是:UTF-8 为 char,UTF-16 为 wchar_t,UTF32 为 uint32_t
  • 支持自定义的编码。

API 风格

  • SAX(Simple API for XML)风格 API
  • DOM(Document Object Model)风格 API

解析

  • 递归式(预设)及迭代式解析器
    • 递归式解析器较快,但在极端情况下可出现堆栈溢出。
    • 迭代式解析器使用自定义的堆栈去维持解析状态。
  • 支持原位(*in situ*)解析。
    • 把 JSON 字符串的值解析至原 JSON 之中,然后让 DOM 指向那些字符串。
    • 比常规分析更快:不需字符串的内存分配、不需复制(如字符串不含转义符)、缓存友好。
  • 对于 JSON 数字类型,支持 32-bit/64-bit 的有号/无号整数,以及 double
  • 错误处理
    • 支持详尽的解析错误代号。
    • 支持本地化错误信息。

DOM (Document)

  • RapidJSON 在类型转换时会检查数值的范围。
  • 字符串字面量的优化
    • 只储存指针,不作复制
  • 优化“短”字符串
    • Value 内储存短字符串,无需额外分配。
    • 对 UTF-8 字符串来说,32 位架构下可存储最多 11 字符,64 位下 21 字符(x86-64 下 13 字符)。
  • 可选地支持 std::string(定义 RAPIDJSON_HAS_STDSTRING=1

生成

输入输出流

内存

  • 最小化 DOM 的内存开销。
    • 对大部分 32/64 位机器而言,每个 JSON 值只占 16 或 20 字节(不包含字符串)。
  • 支持快速的预设分配器。
    • 它是一个堆栈形式的分配器(顺序分配,不容许单独释放,适合解析过程之用)。
    • 使用者也可提供一个预分配的缓冲区。(有可能达至无需 CRT 分配就能解析多个 JSON)
  • 支持标准 CRT(C-runtime)分配器。
  • 支持自定义分配器。

其他

  • 一些 C++11 的支持(可选)
    • 右值引用(rvalue reference)
    • noexcept 修饰符
    • 范围 for 循环