C++的JSON解析器及生成器:RapidJSON
簡介
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; }
注意此例子并沒有處理潛在錯誤。
下圖展示執行過程。

本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!