nlib
nn::nlib::msgpack::JsonSchemaValidator クラスfinal

JSON SchemaによりJSONやmsgpackの検証を行うためのクラスです。 [詳解]

#include "nn/nlib/msgpack/JsonSchema.h"

クラス

struct  Detail
 JSON Schemaの検証に失敗した場合、pathというメンバに検証に失敗した場所についての文字列が書き込まれます。 [詳解]
 

公開型

enum  Result {
  kOk = 0,
  kInvalidParam,
  kAlreadyInitialized,
  kOutOfMemory,
  kFail,
  kInvalidSchema,
  kVersionNotSupported
}
 関数の実行結果です。 [詳解]
 

公開メンバ関数

Result Validate (const MpObject &obj, Detail *detail) noexcept
 JSON Schemaによる検証を行います。 [詳解]
 
コンストラクタ、デストラクタ、及び初期化
constexpr JsonSchemaValidator () noexcept
 デフォルトコンストラクタです。
 
 ~JsonSchemaValidator () noexcept
 デストラクタです。
 
 JsonSchemaValidator (JsonSchemaValidator &&rhs)
 ムーブコンストラクタです。
 
JsonSchemaValidatoroperator= (JsonSchemaValidator &&rhs)
 ムーブ代入演算子です。
 
void Reset () noexcept
 このオブジェクトをデフォルトコンストラクタの実行直後の状態にリセットします。
 
Result Init (const nlib_byte_t *schema_bytecode, size_t n) noexcept
 JSON Schemaを指定してオブジェクトを初期化します。 [詳解]
 

詳解

JSON SchemaによりJSONやmsgpackの検証を行うためのクラスです。

説明
このクラスは、JSONやmsgpackなどから構築されたMpObjectの検証を行うために利用することができます。 JSON SchemaはJsonSchemaConverterによりバイトコード形式に変換されたものを利用します。 バイトコードに変換することにより、JSON Schemaをそのまま検証に用いるより高速な検証が可能となります。
JSON Schemaについて
JSON SchemaによりJSON文書の構造を記述することができ、JSON文書が指定された構造に則っているかどうかを検証することができます。 すなわち、JSON文書について以下のような条件を記述し、チェックすることが可能になります。
  • 文字列や数値等であるべきか、オブジェクトや配列であるべきかといった条件
  • 数値の範囲や文字列の長さといった条件
  • 配列の長さや各値についての条件
  • オブジェクト内に存在する名前と値についての条件
  • 上記の連言、選言、否定など
JSON SchemaもJSONにより記述することができ、人間にとって読みやすくプログラムにとっても処理しやすい仕様になっています。 詳しくは以下のURLを参照してください。
覚え書き
"pattern"及び"patternProperties"による検証にはstd::regexを利用します。 std::regexが存在しない環境では"pattern"及び"patternProperties"による検証は全て成功します。
参照
http://json-schema.org/
http://json-schema.org/latest/json-schema-validation.html
https://spacetelescope.github.io/understanding-json-schema/
https://tools.ietf.org/html/draft-zyp-json-schema-04

JsonSchema.h32 行目に定義があります。

列挙型メンバ詳解

◆ Result

関数の実行結果です。

列挙値
kOk 

成功しました。JSON Schemaによる検証に成功しました。

kInvalidParam 

引数が無効です。

kAlreadyInitialized 

既に初期化済みです。

kOutOfMemory 

メモリの確保に失敗しました。

kFail 

JSON Schemaによる検証に失敗しました。

kInvalidSchema 

無効なJSON Schemaです。

kVersionNotSupported 

このバージョンのJSON Schema(JsonSchemaConverterによって作成されたバイトコード)をサポートしていません。

JsonSchema.h34 行目に定義があります。

関数詳解

◆ Init()

nn::nlib::msgpack::JsonSchemaValidator::Init ( const nlib_byte_t schema_bytecode,
size_t  n 
)
noexcept

JSON Schemaを指定してオブジェクトを初期化します。

引数
[in]schema_bytecodeJsonSchemaConverterによってバイトコードに変換されたJSON Schema
[in]nschema_bytecodeのサイズ
戻り値
kOk成功した場合
kInvalidParamschema_bytecodeNULLまたはnが0であった場合
kAlreadyInitialized既にオブジェクトが初期化済みだった場合
kOutOfMemoryメモリの確保に失敗した場合
kInvalidSchemaスキーマが無効だった場合
kVersionNotSupportedサポートしている形式ではなかった場合

◆ Validate()

nn::nlib::msgpack::JsonSchemaValidator::Validate ( const MpObject obj,
Detail detail 
)
noexcept

JSON Schemaによる検証を行います。

引数
[in]objJSON Schemaにより検証されるデータ
[in]detailNULLでない場合、検証が失敗した場合に追加の情報が得られます。
戻り値
kOk検証が成功した場合
kFail検証が失敗した場合
kOutOfMemoryメモリの確保に失敗した場合
kInvalidSchemaスキーマが無効だった場合
説明
以下はJSON Schemaをコンパイルし、2つのJSONの検証を行うコード例です。
auto schema = ToMpObject(R"({
"$schema": "http://json-schema.org/draft-06/schema#",
"title": "Product",
"description": "A product from Acme's catalog",
"type": "object",
"properties": {
"id": {
"description": "The unique identifier for a product",
"type": "integer"
},
"name": {
"description": "Name of the product",
"type": "string"
},
"price": {
"type": "number",
"exclusiveMinimum": 0
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"uniqueItems": true
}
},
"required": ["id", "name", "price"]
})");
JsonSchemaConverter converter;
SUCCEED_IF(converter.Init() == JsonSchemaConverter::kOk);
SUCCEED_IF(converter.Convert(schema.get(), nullptr) == JsonSchemaConverter::kOk);
auto bin_schema = converter.Export();
SUCCEED_IF(std::get<0>(bin_schema) == JsonSchemaConverter::kOk);
SUCCEED_IF(validator.Init(std::get<1>(bin_schema).get(), std::get<2>(bin_schema)) == JsonSchemaValidator::kOk);
auto conformant_json = ToMpObject(R"({
"id": 1,
"name": "A green door",
"price": 12.50,
"tags": ["home", "green"]
})");
SUCCEED_IF(validator.Validate(*conformant_json, nullptr) == JsonSchemaValidator::kOk);
// 'price' is not conformat to the schema
auto non_conformant_json = ToMpObject(R"({
"id": 1,
"name": "A green door",
"price": -3.0,
"tags": ["home", "green"]
})");
SUCCEED_IF(validator.Validate(*non_conformant_json, nullptr) == JsonSchemaValidator::kFail);

このクラス詳解は次のファイルから抽出されました: