C++的JSON開發包,RapidJSON 1.0 正式版發布
RapidJSON是一個C++的JSON解析器及生成器。它的靈感來自RapidXml。
- RapidJSON小而全。它同時支持SAX和DOM風格的API。SAX解析器只有約500行代碼。
-
RapidJSON快。它的性能可與
strlen()相比。可支持SSE2/SSE4.2加速。 - RapidJSON獨立。它不依賴于BOOST等外部庫。它甚至不依賴于STL。
- RapidJSON對內存友好。在大部分32/64位機器上,每個JSON值只占16或20字節(除字符串外)。它預設使用一個快速的內存分配器,令分析器可以緊湊地分配內存。
-
RapidJSON對Unicode友好。它支持UTF-8、UTF-16、UTF-32
(大端序/小端序),并內部支持這些編碼的檢測、校驗及轉碼。例如,RapidJSON可以在分析一個UTF-8文件至DOM時,把當中的JSON字符串
轉碼至UTF-16。它也支持代理對(surrogate pair)及
"\\u0000"(空字符)。
在這里可讀取更多特點。
JSON(JavaScript Object Notation)是一個輕量的數據交換格式。RapidJSON應該完全遵從RFC7159/ECMA-404。 關于JSON的更多信息可參考:
- Introducing JSON
- RFC7159: The JavaScript Object Notation (JSON) Data Interchange Format
- Standard ECMA-404: The JSON Data Interchange Format
兼容性
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
- Clang 3.4 在 Android NDK
用戶也可以在他們的平臺上生成及執行單元測試。
安裝
RapidJSON是只有頭文件的C++庫。只需把include/rapidjson目錄復制至系統或項目的include目錄中。
生成測試及例子的步驟:
-
執行
git submodule update --init去獲取 thirdparty submodules (google test)。 - 下載 premake4。
-
復制 premake4 可執行文件至
rapidjson/build(或系統路徑)。 -
進入
rapidjson/build/目錄,在Windows下執行premake.bat,在Linux或其他平臺下執行premake.sh。 -
在Windows上,生成位于
rapidjson/build/vs2008/或/vs2010/內的項目方案. -
在其他平臺上,在
rapidjson/build/gmake/目錄執行GNUmake(如make -f test.make config=release32、make -f example.make config=debug32)。 -
若成功,可執行文件會生成在
rapidjson/bin目錄。
生成Doxygen文檔的步驟:
- 下載及安裝Doxygen。
-
在頂層目錄執行
doxygen build/Doxyfile。 -
在
doc/html瀏覽文檔。
用法一覽
此簡單例子解析一個JSON字符串至一個document (DOM),對DOM作出簡單修改,最終把DOM轉換(stringify)至JSON字符串。
// rapidjson/example/simpledom/simpledom.cpp`
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include <iostream>
using namespace rapidjson;
int main() {
// 1. 把JSON解析至DOM。
const char* json = "{\"project\":\"rapidjson\",\"stars\":10}";
Document d;
d.Parse(json);
// 2. 利用DOM作出修改。
Value& s = d["stars"];
s.SetInt(s.GetInt() + 1);
// 3. 把DOM轉換(stringify)成JSON。
StringBuffer buffer;
Writer<StringBuffer> writer(buffer);
d.Accept(writer);
// Output {"project":"rapidjson","stars":11}
std::cout << buffer.GetString() << std::endl;
return 0;
}
注意此例子并沒有處理潛在錯誤。
下圖展示執行過程。
RapidJSON 1.0 正式版發布,該版本在 1.0 Beta 的基礎上實現了 100% 單元測試的覆蓋率。
其他方面的改進包括:
-
Fixed a bug in trimming long number sequence (4824f12)
-
Fix double quote in unicode escape (#288)
-
Fix negative zero roundtrip (double only) (#289)
-
Remove an invalid Document::ParseInsitu() API (e7f1c6d)
-
Remove dead branches and add more unit tests for coverage
-
Standardize behavior of
memcpy()andmalloc()(0c5c153, #305, 0e8bbe5) -
Add version macros (#311)