Commit 96ca8479 authored by Milo Yip's avatar Milo Yip

Merge branch 'master' into example

parents e6a1bd91 e4ff9c0e
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -3,50 +3,50 @@
## 总体
* 跨平台
* 编译器:Visual Studio、gcc、clang等
* 架构:x86、x64、ARM等
* 操作系统:Windows、Mac OS X、Linux、iOS、Android等
* 编译器: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
* 不需依赖 STL、BOOST 等。
* 只包含 `<cstdio>`, `<cstdlib>`, `<cstring>`, `<inttypes.h>`, `<new>`, `<stdint.h>`
* 没使用 C++ 异常、RTTI
* 高性能
* 使用模版及内联函数去降低函数调用开销。
* 内部经优化的Grisu2及浮点数解析实现。
* 可选的SSE2/SSE4.2支持。
* 内部经优化的 Grisu2 及浮点数解析实现。
* 可选的 SSE2/SSE4.2 支持。
## 符合标准
* RapidJSON应完全符合RFC4627/ECMA-404标准。
* 支持Unicod代理对(surrogate pair)。
* RapidJSON 应完全符合 RFC4627/ECMA-404 标准。
* 支持 Unicod 代理对(surrogate pair)。
* 支持空字符(`"\u0000"`)。
* 例如,可以优雅地解析及处理`["Hello\u0000World"]`。含读写字符串长度的API。
* 例如,可以优雅地解析及处理 `["Hello\u0000World"]`。含读写字符串长度的 API。
* 支持放宽的可选语法
* 单行(`// ...`)及多行(`/* ... */`) 注释(`kParseCommentsFlag`)。
* 在对象和数组结束前含逗号(`kParseTrailingCommasFlag`)。
* 单行(`// ...`)及多行(`/* ... */`) 注释 (`kParseCommentsFlag`)。
* 在对象和数组结束前含逗号 (`kParseTrailingCommasFlag`)。
## Unicode
* 支持UTF-8、UTF-16、UTF-32编码,包括小端序和大端序。
* 支持 UTF-8、UTF-16、UTF-32 编码,包括小端序和大端序。
* 这些编码用于输入输出流,以及内存中的表示。
* 支持从输入流自动检测编码。
* 内部支持编码的转换。
* 例如,你可以读取一个UTF-8文件,让RapidJSON把JSON字符串转换至UTF-16的DOM。
* 例如,你可以读取一个 UTF-8 文件,让 RapidJSON 把 JSON 字符串转换至 UTF-16 的 DOM。
* 内部支持编码校验。
* 例如,你可以读取一个UTF-8文件,让RapidJSON检查是否所有JSON字符串是合法的UTF-8字节序列。
* 例如,你可以读取一个 UTF-8 文件,让 RapidJSON 检查是否所有 JSON 字符串是合法的 UTF-8 字节序列。
* 支持自定义的字符类型。
* 预设的字符类型是:UTF-8`char`,UTF-16为`wchar_t`,UTF32为`uint32_t`
* 预设的字符类型是:UTF-8`char`,UTF-16 为 `wchar_t`,UTF32 为 `uint32_t`
* 支持自定义的编码。
## API风格
## API 风格
* SAX(Simple API for XML)风格API
* 类似于[SAX](http://en.wikipedia.org/wiki/Simple_API_for_XML), RapidJSON提供一个事件循序访问的解析器API(`rapidjson::GenericReader`)。RapidJSON也提供一个生成器API(`rapidjson::Writer`),可以处理相同的事件集合。
* DOM(Document Object Model)风格API
* 类似于HTML/XML的[DOM](http://en.wikipedia.org/wiki/Document_Object_Model),RapidJSON可把JSON解析至一个DOM表示方式(`rapidjson::GenericDocument`),以方便操作。如有需要,可把DOM转换(stringify)回JSON。
* DOM风格API(`rapidjson::GenericDocument`)实际上是由SAX风格API(`rapidjson::GenericReader`)实现的。SAX更快,但有时DOM更易用。用户可根据情况作出选择。
* SAX(Simple API for XML)风格 API
* 类似于 [SAX](http://en.wikipedia.org/wiki/Simple_API_for_XML), RapidJSON 提供一个事件循序访问的解析器 API(`rapidjson::GenericReader`)。RapidJSON 也提供一个生成器 API(`rapidjson::Writer`),可以处理相同的事件集合。
* DOM(Document Object Model)风格 API
* 类似于 HTML/XML 的 [DOM](http://en.wikipedia.org/wiki/Document_Object_Model),RapidJSON 可把 JSON 解析至一个 DOM 表示方式(`rapidjson::GenericDocument`),以方便操作。如有需要,可把 DOM 转换(stringify)回 JSON。
* DOM 风格 API(`rapidjson::GenericDocument`)实际上是由 SAX 风格 API(`rapidjson::GenericReader`)实现的。SAX 更快,但有时 DOM 更易用。用户可根据情况作出选择。
## 解析
......@@ -54,45 +54,45 @@
* 递归式解析器较快,但在极端情况下可出现堆栈溢出。
* 迭代式解析器使用自定义的堆栈去维持解析状态。
* 支持原位(*in situ*)解析。
*JSON字符串的值解析至原JSON之中,然后让DOM指向那些字符串。
* JSON 字符串的值解析至原 JSON 之中,然后让 DOM 指向那些字符串。
* 比常规分析更快:不需字符串的内存分配、不需复制(如字符串不含转义符)、缓存友好。
* 对于JSON数字类型,支持32-bit/64-bit的有号/无号整数,以及`double`
* 对于 JSON 数字类型,支持 32-bit/64-bit 的有号/无号整数,以及 `double`
* 错误处理
* 支持详尽的解析错误代号。
* 支持本地化错误信息。
## DOM (Document)
* RapidJSON在类型转换时会检查数值的范围。
* RapidJSON 在类型转换时会检查数值的范围。
* 字符串字面量的优化
* 只储存指针,不作复制
* 优化“短”字符串
*`Value`内储存短字符串,无需额外分配。
*UTF-8字符串来说,32位架构下可存储最多11字符,64位下15字符。
* 可选地支持`std::string`(定义`RAPIDJSON_HAS_STDSTRING=1`
* `Value` 内储存短字符串,无需额外分配。
* UTF-8 字符串来说,32 位架构下可存储最多 11 字符,64 位下 15 字符。
* 可选地支持 `std::string`(定义 `RAPIDJSON_HAS_STDSTRING=1`
## 生成
* 支持`rapidjson::PrettyWriter`去加入换行及缩进。
* 支持 `rapidjson::PrettyWriter` 去加入换行及缩进。
## 输入输出流
* 支持`rapidjson::GenericStringBuffer`,把输出的JSON储存于字符串内。
* 支持`rapidjson::FileReadStream``rapidjson::FileWriteStream`,使用`FILE`对象作输入输出。
* 支持 `rapidjson::GenericStringBuffer`,把输出的 JSON 储存于字符串内。
* 支持 `rapidjson::FileReadStream``rapidjson::FileWriteStream`,使用 `FILE` 对象作输入输出。
* 支持自定义输入输出流。
## 内存
* 最小化DOM的内存开销。
* 对大部分32/64位机器而言,每个JSON值只占16或20字节(不包含字符串)。
* 最小化 DOM 的内存开销。
* 对大部分 32/64 位机器而言,每个 JSON 值只占 16 或 20 字节(不包含字符串)。
* 支持快速的预设分配器。
* 它是一个堆栈形式的分配器(顺序分配,不容许单独释放,适合解析过程之用)。
* 使用者也可提供一个预分配的缓冲区。(有可能达至无需CRT分配就能解析多个JSON)
* 支持标准CRT(C-runtime)分配器。
* 使用者也可提供一个预分配的缓冲区。(有可能达至无需 CRT 分配就能解析多个 JSON)
* 支持标准 CRT(C-runtime)分配器。
* 支持自定义分配器。
## 其他
* 一些C++11的支持(可选)
* 一些 C++11 的支持(可选)
* 右值引用(rvalue reference)
* `noexcept`修饰符
* `noexcept` 修饰符
# 性能
有一个[native JSON benchmark collection][1]项目,能评估20个JSON库在不同操作下的速度、內存用量及代码大小。
有一个 [native JSON benchmark collection][1] 项目,能评估 20 个 JSON 库在不同操作下的速度、內存用量及代码大小。
[1]: https://github.com/miloyip/nativejson-benchmark
RapidJSON 0.1版本的性能测试文章位于[这里](https://code.google.com/p/rapidjson/wiki/Performance).
RapidJSON 0.1 版本的性能测试文章位于 [这里](https://code.google.com/p/rapidjson/wiki/Performance).
此外,你也可以参考以下这些第三方的评测。
......
......@@ -25,7 +25,7 @@ JSON Pointer 是一个标准化([RFC6901])的方式去选取一个 JSON Docu
3. `"/foo/1"``"baz"`
4. `"/pi"``3.1416`
要注意,一个空 JSON Pointer `""` (零个token)解析为整个 JSON。
要注意,一个空 JSON Pointer `""` (零个 token)解析为整个 JSON。
# 基本使用方法 {#BasicUsage}
......@@ -123,7 +123,7 @@ assert(success);
Token `"0"` 在第一个 pointer 中被当作成员名字。它在第二个 pointer 中被当作成数组索引。
其他函数会改变 DOM,包括`Create()``GetWithDefault()``Set()``Swap()`。这些函数总是成功的。若一些父值不存在,就会创建它们。若父值类型不匹配 token,也会强行改变其类型。改变类型也意味着完全移除其 DOM 子树的内容。
其他函数会改变 DOM,包括 `Create()``GetWithDefault()``Set()``Swap()`。这些函数总是成功的。若一些父值不存在,就会创建它们。若父值类型不匹配 token,也会强行改变其类型。改变类型也意味着完全移除其 DOM 子树的内容。
例如,把上面的 JSON 解译至 `d` 之后,
......@@ -185,7 +185,7 @@ private:
# URI 片段表示方式 {#URIFragment}
除了我们一直在使用的字符串方式表示 JSON pointer,[RFC6901]也定义了一个 JSON Pointer 的 URI 片段(fragment)表示方式。URI 片段是定义于 [RFC3986] "Uniform Resource Identifier (URI): Generic Syntax"。
除了我们一直在使用的字符串方式表示 JSON pointer,[RFC6901] 也定义了一个 JSON Pointer 的 URI 片段(fragment)表示方式。URI 片段是定义于 [RFC3986] "Uniform Resource Identifier (URI): Generic Syntax"。
URI 片段的主要分别是必然以 `#` (pound sign)开头,而一些字符也会以百分比编码成 UTF-8 序列。例如,以下的表展示了不同表示法下的 C/C++ 字符串常数。
......
This diff is collapsed.
......@@ -146,7 +146,7 @@ if (!d.Accept(validator)) {
## 远程 Schema
JSON Schema 支持 [`$ref` 关键字](http://spacetelescope.github.io/understanding-json-schema/structuring.html),它是一个[JSON pointer](pointer.md) 引用至一个本地(local)或远程(remote) schema。本地指针的首字符是 `#`,而远程指针是一个相对或绝对 URI。例如:
JSON Schema 支持 [`$ref` 关键字](http://spacetelescope.github.io/understanding-json-schema/structuring.html),它是一个 [JSON pointer](pointer.md) 引用至一个本地(local)或远程(remote) schema。本地指针的首字符是 `#`,而远程指针是一个相对或绝对 URI。例如:
~~~js
{ "$ref": "definitions.json#/address" }
......
This diff is collapsed.
This diff is collapsed.
......@@ -2,7 +2,7 @@
![](https://img.shields.io/badge/release-v1.0.2-blue.png)
## 高效的C++ JSON解析/生成器,提供SAX及DOM风格API
## 高效的 C++ JSON 解析/生成器,提供 SAX 及 DOM 风格 API
Tencent is pleased to support the open source community by making RapidJSON available.
......@@ -12,7 +12,7 @@ Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights
* RapidJSON 文档
* [English](http://rapidjson.org/)
* [简体中文](http://rapidjson.org/zh-cn/)
* [GitBook](https://www.gitbook.com/book/miloyip/rapidjson/)可下载PDF/EPUB/MOBI,但不含API参考手册。
* [GitBook](https://www.gitbook.com/book/miloyip/rapidjson/) 可下载 PDF/EPUB/MOBI,但不含 API 参考手册。
## Build 状态
......@@ -29,28 +29,28 @@ Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights
## 简介
RapidJSON是一个C++的JSON解析器及生成器。它的灵感来自[RapidXml](http://rapidxml.sourceforge.net/)
RapidJSON 是一个 C++ 的 JSON 解析器及生成器。它的灵感来自 [RapidXml](http://rapidxml.sourceforge.net/)
* RapidJSON小而全。它同时支持SAX和DOM风格的API。SAX解析器只有约500行代码。
* RapidJSON 小而全。它同时支持 SAX 和 DOM 风格的 API。SAX 解析器只有约 500 行代码。
* RapidJSON快。它的性能可与`strlen()`相比。可支持SSE2/SSE4.2加速。
* RapidJSON 快。它的性能可与 `strlen()` 相比。可支持 SSE2/SSE4.2 加速。
* RapidJSON独立。它不依赖于BOOST等外部库。它甚至不依赖于STL。
* RapidJSON 独立。它不依赖于 BOOST 等外部库。它甚至不依赖于 STL。
* RapidJSON对内存友好。在大部分32/64位机器上,每个JSON值只占16或20字节(除字符串外)。它预设使用一个快速的内存分配器,令分析器可以紧凑地分配内存。
* RapidJSON 对内存友好。在大部分 32/64 位机器上,每个 JSON 值只占 16 或 20 字节(除字符串外)。它预设使用一个快速的内存分配器,令分析器可以紧凑地分配内存。
* RapidJSON对Unicode友好。它支持UTF-8、UTF-16、UTF-32 (大端序/小端序),并内部支持这些编码的检测、校验及转码。例如,RapidJSON可以在分析一个UTF-8文件至DOM时,把当中的JSON字符串转码至UTF-16。它也支持代理对(surrogate pair)及`"\u0000"`(空字符)。
* RapidJSON 对 Unicode 友好。它支持 UTF-8、UTF-16、UTF-32 (大端序/小端序),并内部支持这些编码的检测、校验及转码。例如,RapidJSON 可以在分析一个 UTF-8 文件至 DOM 时,把当中的 JSON 字符串转码至 UTF-16。它也支持代理对(surrogate pair)及 `"\u0000"`(空字符)。
[这里](doc/features.md)可读取更多特点。
[这里](doc/features.md) 可读取更多特点。
JSON(JavaScript Object Notation)是一个轻量的数据交换格式。RapidJSON应该完全遵从RFC7159/ECMA-404。 关于JSON的更多信息可参考:
JSON(JavaScript Object Notation)是一个轻量的数据交换格式。RapidJSON 应该完全遵从 RFC7159/ECMA-404。 关于 JSON 的更多信息可参考:
* [Introducing JSON](http://json.org/)
* [RFC7159: The JavaScript Object Notation (JSON) Data Interchange Format](http://www.ietf.org/rfc/rfc7159.txt)
* [Standard ECMA-404: The JSON Data Interchange Format](http://www.ecma-international.org/publications/standards/Ecma-404.htm)
## 兼容性
RapidJSON是跨平台的。以下是一些曾测试的平台/编译器组合:
RapidJSON 是跨平台的。以下是一些曾测试的平台/编译器组合:
* Visual C++ 2008/2010/2013 在 Windows (32/64-bit)
* GNU C++ 3.8.x 在 Cygwin
* Clang 3.4 在 Mac OS X (32/64-bit) 及 iOS
......@@ -60,27 +60,27 @@ RapidJSON是跨平台的。以下是一些曾测试的平台/编译器组合
## 安装
RapidJSON是只有头文件的C++库。只需把`include/rapidjson`目录复制至系统或项目的include目录中。
RapidJSON 是只有头文件的 C++ 库。只需把 `include/rapidjson` 目录复制至系统或项目的 include 目录中。
RapidJSON依赖于以下软件:
RapidJSON 依赖于以下软件:
* [CMake](http://www.cmake.org) 作为通用生成工具
* (optional)[Doxygen](http://www.doxygen.org)用于生成文档
* (optional)[googletest](https://code.google.com/p/googletest/)用于单元及性能测试
* (optional)[Doxygen](http://www.doxygen.org) 用于生成文档
* (optional)[googletest](https://code.google.com/p/googletest/) 用于单元及性能测试
生成测试及例子的步骤:
1. 执行 `git submodule update --init` 去获取 thirdparty submodules (google test)。
2.rapidjson目渌下,建立一个`build`目录。
3.`build`目录下执行`cmake ..`命令以设置生成。Windows用户可使用cmake-gui应用程序。
4.Windows下,编译生成在build目录中的solution。在Linux下,于build目录运行`make`
2. rapidjson 目渌下,建立一个 `build` 目录。
3. `build` 目录下执行 `cmake ..` 命令以设置生成。Windows 用户可使用 cmake-gui 应用程序。
4. Windows 下,编译生成在 build 目录中的 solution。在 Linux 下,于 build 目录运行 `make`
成功生成后,你会在`bin`的目录下找到编译后的测试及例子可执行文件。而生成的文档将位于build下的`doc/html`目录。要执行测试,请在build下执行`make test``ctest`。使用`ctest -V`命令可获取详细的输出。
成功生成后,你会在 `bin` 的目录下找到编译后的测试及例子可执行文件。而生成的文档将位于 build 下的 `doc/html` 目录。要执行测试,请在 build 下执行 `make test``ctest`。使用 `ctest -V` 命令可获取详细的输出。
我们也可以把程序库安装至全系统中,只要在具管理權限下从build目录执行`make install`命令。这样会按系统的偏好设置安装所有文件。当安装RapidJSON后,其他的CMake项目需要使用它时,可以通过在`CMakeLists.txt`加入一句`find_package(RapidJSON)`
我们也可以把程序库安装至全系统中,只要在具管理權限下从 build 目录执行 `make install` 命令。这样会按系统的偏好设置安装所有文件。当安装 RapidJSON 后,其他的 CMake 项目需要使用它时,可以通过在 `CMakeLists.txt` 加入一句 `find_package(RapidJSON)`
## 用法一览
此简单例子解析一个JSON字符串至一个document (DOM),对DOM作出简单修改,最终把DOM转换(stringify)至JSON字符串。
此简单例子解析一个 JSON 字符串至一个 document (DOM),对 DOM 作出简单修改,最终把 DOM 转换(stringify)至 JSON 字符串。
~~~~~~~~~~cpp
// rapidjson/example/simpledom/simpledom.cpp`
......@@ -92,16 +92,16 @@ RapidJSON依赖于以下软件:
using namespace rapidjson;
int main() {
// 1. 把JSON解析至DOM。
// 1. 把 JSON 解析至 DOM。
const char* json = "{\"project\":\"rapidjson\",\"stars\":10}";
Document d;
d.Parse(json);
// 2. 利用DOM作出修改。
// 2. 利用 DOM 作出修改。
Value& s = d["stars"];
s.SetInt(s.GetInt() + 1);
// 3. 把DOM转换(stringify)成JSON。
// 3. 把 DOM 转换(stringify)成 JSON。
StringBuffer buffer;
Writer<StringBuffer> writer(buffer);
d.Accept(writer);
......@@ -118,7 +118,7 @@ int main() {
![simpledom](doc/diagram/simpledom.png)
还有许多[例子](https://github.com/miloyip/rapidjson/tree/master/example)可供参考:
还有许多 [例子](https://github.com/miloyip/rapidjson/tree/master/example) 可供参考:
* DOM API
* [tutorial](https://github.com/miloyip/rapidjson/blob/master/example/tutorial/tutorial.cpp): DOM API 的基本使用方法。
......@@ -137,4 +137,4 @@ int main() {
* 进阶
* [prettyauto](https://github.com/miloyip/rapidjson/blob/master/example/prettyauto/prettyauto.cpp): [pretty](https://github.com/miloyip/rapidjson/blob/master/example/pretty/pretty.cpp) 的修改版本,可自动处理任何 UTF 编码的 JSON。
* [parsebyparts](https://github.com/miloyip/rapidjson/blob/master/example/parsebyparts/parsebyparts.cpp): 这例子中的`AsyncDocumentParser` 类使用 C++ 线程来逐段解析 JSON。
* [parsebyparts](https://github.com/miloyip/rapidjson/blob/master/example/parsebyparts/parsebyparts.cpp): 这例子中的 `AsyncDocumentParser` 类使用 C++ 线程来逐段解析 JSON。
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment