RapidJSON (バリデーション)
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
トピックス
なし
スター履歴
データ取得日時: 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両対応により、様々なユースケースに対応できる柔軟性も備えています。