C++的JSON解析器及生成器:RapidJSON

jopen 9年前發布 | 146K 次閱讀 RapidJSON JSON開發包

簡介

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的更多信息可參考:

兼容性

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目錄中。

生成測試及例子的步驟:

  1. 執行git submodule update --init去獲取 thirdparty submodules (google test)。
  2. 下載 premake4
  3. 復制 premake4 可執行文件至rapidjson/build(或系統路徑)。
  4. 進入rapidjson/build/目錄,在Windows下執行premake.bat,在Linux或其他平臺下執行premake.sh。
  5. 在Windows上,生成位于rapidjson/build/vs2008/或/vs2010/內的項目方案.
  6. 在其他平臺上,在rapidjson/build/gmake/目錄執行GNUmake(如make -f test.make config=release32、make -f example.make config=debug32)。
  7. 若成功,可執行文件會生成在rapidjson/bin目錄。

生成Doxygen文檔的步驟:

  1. 下載及安裝Doxygen
  2. 在頂層目錄執行doxygen build/Doxyfile。
  3. 在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;
}

注意此例子并沒有處理潛在錯誤。

下圖展示執行過程。

C++的JSON解析器及生成器:RapidJSON

項目主頁:http://www.baiduhome.net/lib/view/home/1429837362276

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