总体
- 跨平台
- 编译器: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标准。
- 支持Unicod代理对(surrogate pair)。
- 支持空字符(
"\\u0000"
)。
- 例如,可以优雅地解析及处理
["Hello\\u0000World"]
。含读写字符串长度的API。
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位下15字符。
- 可选地支持
std::string
(定义RAPIDJSON_HAS_STDSTRING=1
)
生成
输入输出流
内存
- 最小化DOM的内存开销。
- 对大部分32/64位机器而言,每个JSON值只占16或20字节(不包含字符串)。
- 支持快速的预设分配器。
- 它是一个堆栈形式的分配器(顺序分配,不容许单独释放,适合解析过程之用)。
- 使用者也可提供一个预分配的缓冲区。(有可能达至无需CRT分配就能解析多个JSON)
- 支持标准CRT(C-runtime)分配器。
- 支持自定义分配器。
其他
- 一些C++11的支持(可选)
- 右值引用(rvalue reference)
noexcept
修饰符