mirror of
https://git.suyu.dev/suyu/suyu.git
synced 2024-12-20 12:31:02 +01:00
4.7 KiB
Executable file
4.7 KiB
Executable file
特点
总体
- 跨平台
- 编译器: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.
- 支持 Unicod 代理对(surrogate pair)。
- 支持空字符(
"\u0000"
)。 - 例如,可以优雅地解析及处理
["Hello\u0000World"]
。含读写字符串长度的 API。 - 支持可选的放宽语法
- 单行(
// ...
)及多行(/* ... */
) 注释 (kParseCommentsFlag
)。 - 在对象和数组结束前含逗号 (
kParseTrailingCommasFlag
)。 NaN
、Inf
、Infinity
、-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
- 类似于 SAX, RapidJSON 提供一个事件循序访问的解析器 API(
rapidjson::GenericReader
)。RapidJSON 也提供一个生成器 API(rapidjson::Writer
),可以处理相同的事件集合。 - DOM(Document Object Model)风格 API
- 类似于 HTML/XML 的 DOM,RapidJSON 可把 JSON 解析至一个 DOM 表示方式(
rapidjson::GenericDocument
),以方便操作。如有需要,可把 DOM 转换(stringify)回 JSON。 - DOM 风格 API(
rapidjson::GenericDocument
)实际上是由 SAX 风格 API(rapidjson::GenericReader
)实现的。SAX 更快,但有时 DOM 更易用。用户可根据情况作出选择。
解析
- 递归式(预设)及迭代式解析器
- 递归式解析器较快,但在极端情况下可出现堆栈溢出。
- 迭代式解析器使用自定义的堆栈去维持解析状态。
- 支持原位(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
)
生成
- 支持
rapidjson::PrettyWriter
去加入换行及缩进。
输入输出流
- 支持
rapidjson::GenericStringBuffer
,把输出的 JSON 储存于字符串内。 - 支持
rapidjson::FileReadStream
及rapidjson::FileWriteStream
,使用FILE
对象作输入输出。 - 支持自定义输入输出流。
内存
- 最小化 DOM 的内存开销。
- 对大部分 32/64 位机器而言,每个 JSON 值只占 16 或 20 字节(不包含字符串)。
- 支持快速的预设分配器。
- 它是一个堆栈形式的分配器(顺序分配,不容许单独释放,适合解析过程之用)。
- 使用者也可提供一个预分配的缓冲区。(有可能达至无需 CRT 分配就能解析多个 JSON)
- 支持标准 CRT(C-runtime)分配器。
- 支持自定义分配器。
其他
- 一些 C++11 的支持(可选)
- 右值引用(rvalue reference)
noexcept
修饰符- 范围 for 循环