全般

  • クロスプラットフォーム
    • コンパイラー: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に対応。
  • Unicodeのサロゲートに対応。
  • ヌル文字("\u0000")に対応。
    • たとえば、["Hello\u0000World"]を解析し、適切に扱えます。文字列の長さを取得・設定するAPIがあります。
  • 任意で緩和された構文に対応。
    • 単一行(// ...)と複数行(/* ... */)のコメント(kParseCommentsFlag)。
    • オブジェクトや配列の末尾のカンマ(kParseTrailingCommasFlag)。
    • NaN、Inf、Infinity、-Inf、-Infinityをdouble値として扱います(kParseNanAndInfFlag)。
  • NPMに対応。

Unicode

  • リトルエンディアンとビッグエンディアンを含むUTF-8、UTF-16、UTF-32エンコーディングに対応。
    • これらのエンコーディングを入出力ストリームとメモリー内の表現に使用します。
  • 入力ストリームのエンコーディングの自動検出に対応。
  • エンコーディング間の変換を内部で処理できます。
    • たとえば、UTF-8ファイルを読み、DOM内のJSON文字列をRapidJSONでUTF-16へ変換できます。
  • エンコーディングの妥当性検証を内部で処理できます。
    • たとえば、UTF-8ファイルを読み、すべてのJSON文字列が妥当なUTF-8バイト列かどうかをRapidJSONで確認できます。
  • 独自の文字型に対応。
    • 既定の文字型は、UTF8ではchar、UTF16ではwchar_t、UTF32ではuint32_tです。
  • 独自のエンコーディングに対応。

APIのスタイル

  • SAX(Simple API for XML)形式のAPI
    • SAXと同様に、RapidJSONはイベントへ順次アクセスするパーサーAPI(rapidjson::GenericReader)を提供します。同じイベント群を受け取る生成器API(rapidjson::Writer)も提供します。
  • DOM(Document Object Model)形式のAPI
    • HTML/XMLのDOMと同様に、RapidJSONはJSONをDOM表現(rapidjson::GenericDocument)へ解析し、簡単に操作できます。必要なら最後にJSONへ戻せます。
    • DOM形式のAPI(rapidjson::GenericDocument)は、実際にはSAX形式のAPI(rapidjson::GenericReader)を使って実装されています。SAXの方が高速ですが、DOMの方が使いやすい場合もあります。利用場面に応じて選択できます。

解析

  • 再帰型(既定)と反復型のパーサー
    • 再帰型パーサーは高速ですが、極端な場合にはスタックオーバーフローが起こりやすくなります。
    • 反復型パーサーは、解析状態の保持に独自のスタックを使います。
  • in situ解析に対応。
    • 元のJSON内で文字列値をその場で解析し、DOMはそれらの文字列のアドレスを指します。
    • 通常の解析より高速です。文字列用のメモリー確保が不要で、エスケープを含まなければコピーも不要です。キャッシュにも適しています。
  • JSONの数値型として、32ビット・64ビットの符号付き整数・符号なし整数とdoubleに対応。
  • 入力ストリーム中の複数のJSONの解析に対応(kParseStopWhenDoneFlag)。
  • エラー処理
    • 解析に失敗したときに、広範なエラーコードを提供します。
    • エラーメッセージのローカライズに対応。

DOM(Document)

  • RapidJSONは、変換時に数値の範囲を確認します。
  • 文字列リテラルの最適化
    • コピーせず、ポインターだけを保存します。
  • 「短い」文字列の最適化
    • 短い文字列は、追加のメモリー確保をせずにValue内部へ保存します。
    • UTF-8文字列では、32ビット環境で最大11文字、64ビット環境で21文字(x86-64では13文字)。
  • 任意でstd::stringに対応(RAPIDJSON_HAS_STDSTRING=1を定義)。

生成

ストリーム

メモリー

  • DOMのメモリーオーバーヘッドを最小化します。
    • 大半の32ビット・64ビット環境で、各JSON値は正確に16/20バイトを占めます(文字列のテキストを除く)。
  • 高速な既定のアロケーターに対応。
    • スタックに基づくアロケーターです。順番に確保し、個別の確保領域の解放を禁止するため、解析に適しています。
    • 事前に確保したバッファーを指定できます。(CRTによるメモリー確保を一度も行わずに複数のJSONを解析できる場合があります。)
  • 標準のCRT(Cランタイム)アロケーターに対応。
  • 独自のアロケーターに対応。

その他

  • C++11の一部に対応(任意)
    • 右辺値参照
    • noexcept指定子
    • 範囲ベースのforループ