RapidJSON (バリデーション)

C++JSONバリデーションJSON Schema高速パフォーマンス

GitHub概要

Tencent/rapidjson

A fast JSON parser/generator for C++ with both SAX/DOM style API

スター14,763
ウォッチ557
フォーク3,606
作成日:2014年3月4日
言語:C++
ライセンス:Other

トピックス

なし

スター履歴

Tencent/rapidjson Star History
データ取得日時: 2025/7/19 04:31

RapidJSON (バリデーション)

概要

RapidJSONは、Tencentが開発した高速なC++ JSONライブラリです。SAX/DOMスタイルのAPIを提供し、JSON Schemaバリデーション機能を内蔵しています。ゼロコピー最適化により、極めて高いパフォーマンスを実現しており、ゲームサーバーやリアルタイムシステムなど、パフォーマンスが重要なアプリケーションで広く使用されています。

特徴

  • 高速パース: 業界最速クラスのJSONパース性能
  • JSON Schemaサポート: 組み込みのJSON Schema Draft v4バリデーション
  • メモリ効率: ゼロコピー最適化によるメモリ使用量の削減
  • SAX/DOM両対応: ストリーミング処理とツリー構造の両方をサポート
  • 完全なUnicode対応: UTF-8、UTF-16、UTF-32をサポート
  • ヘッダーオンリー: 簡単な統合が可能

使用例

基本的なJSON Schemaバリデーション

#include "rapidjson/document.h"
#include "rapidjson/schema.h"
#include "rapidjson/stringbuffer.h"

using namespace rapidjson;

// JSONスキーマの定義
const char* schemaJson = R"({
    "type": "object",
    "required": ["name", "age"],
    "properties": {
        "name": {
            "type": "string",
            "minLength": 1
        },
        "age": {
            "type": "integer",
            "minimum": 0,
            "maximum": 150
        },
        "email": {
            "type": "string",
            "format": "email"
        }
    }
})";

// バリデーション実行
Document schemaDoc;
schemaDoc.Parse(schemaJson);

SchemaDocument schema(schemaDoc);
SchemaValidator validator(schema);

// 検証対象のJSON
Document targetDoc;
targetDoc.Parse(R"({
    "name": "John Doe",
    "age": 30,
    "email": "[email protected]"
})");

// バリデーション
if (!targetDoc.Accept(validator)) {
    // エラー情報の取得
    StringBuffer sb;
    validator.GetInvalidSchemaPointer().StringifyUriFragment(sb);
    printf("Invalid schema: %s\n", sb.GetString());
    
    printf("Invalid keyword: %s\n", validator.GetInvalidSchemaKeyword());
    
    sb.Clear();
    validator.GetInvalidDocumentPointer().StringifyUriFragment(sb);
    printf("Invalid document: %s\n", sb.GetString());
}

カスタムバリデーション

// カスタムバリデータの実装
class CustomValidator {
    Document schema;
    
public:
    bool ValidateConfig(const char* json) {
        Document doc;
        doc.Parse(json);
        
        if (doc.HasParseError()) {
            return false;
        }
        
        // 必須フィールドの確認
        if (!doc.HasMember("version") || !doc["version"].IsString()) {
            return false;
        }
        
        // バージョン形式の検証
        std::regex versionRegex(R"(^\d+\.\d+\.\d+$)");
        if (!std::regex_match(doc["version"].GetString(), versionRegex)) {
            return false;
        }
        
        // ネストされたオブジェクトの検証
        if (doc.HasMember("settings")) {
            const Value& settings = doc["settings"];
            if (!settings.IsObject()) {
                return false;
            }
            
            // 設定値の範囲チェック
            if (settings.HasMember("timeout")) {
                if (!settings["timeout"].IsNumber() || 
                    settings["timeout"].GetDouble() < 0 || 
                    settings["timeout"].GetDouble() > 3600) {
                    return false;
                }
            }
        }
        
        return true;
    }
};

パフォーマンス最適化

// In-situパースによる高速化
class FastJsonProcessor {
    static constexpr size_t kBufferSize = 65536;
    char buffer[kBufferSize];
    
public:
    bool ProcessLargeJsonFile(const char* filename) {
        FILE* fp = fopen(filename, "rb");
        if (!fp) return false;
        
        FileReadStream is(fp, buffer, sizeof(buffer));
        
        // In-situパースで文字列のコピーを回避
        Document doc;
        doc.ParseStream<kParseInsituFlag>(is);
        
        fclose(fp);
        
        if (doc.HasParseError()) {
            return false;
        }
        
        // ドキュメントの処理
        return ProcessDocument(doc);
    }
    
private:
    bool ProcessDocument(const Document& doc) {
        // バリデーションとデータ処理
        return true;
    }
};

比較・代替手段

類似ライブラリとの比較

  • nlohmann/json: より使いやすいAPIだが、パフォーマンスは劣る
  • simdjson: 読み取り専用だが、さらに高速なパース
  • Boost.JSON: Boostエコシステムとの統合が優れている

RapidJSONを選ぶべき場合

  • パフォーマンスが最重要の場合
  • JSON Schemaバリデーションが必要な場合
  • 大量のJSONデータを処理する必要がある場合
  • メモリ使用量を最小限に抑えたい場合

学習リソース

まとめ

RapidJSONは、C++における高性能JSONライブラリの代表格です。特にJSON Schemaバリデーション機能を内蔵している点で、データ検証が重要なアプリケーションに最適です。ゼロコピー最適化やSAX/DOM両対応により、様々なユースケースに対応できる柔軟性も備えています。