スキーマと実データの検証

JSON Schemaバリデーター値の位置から条件をたどる

サンプルですぐ試せます。スキーマだけの検査には、検証対象のJSONは不要です。

JSON Schemaバリデーター

JSON Schema

JSONデータ

入力と参照はこのブラウザー内で処理し、検証データの送信や外部参照の取得は行いません。

検証設定

無効時のformatは注釈です。有効にするとajv-formatsの対応形式を検査し、未知の形式はコンパイルエラーになります。

ローカル参照

JSONファイルは10件まで。各ルートには#なしの一意の絶対$idが必要です。ファイル名から参照先を推測しません。

参照ファイルはありません。

    手動検証の準備ができました。

    JSON Schemaバリデーターは、整数が必要な位置の文字列、必須キーの欠落、想定外のプロパティを見つけます。JSONとして読めることと契約を満たすことは別です。実際のレスポンスとルールを並べて原因を調べられます。

    JSONスキーマ検証で入力が自動修正されることはありません。キーの欠落とnullは区別され、defaultを書いても不足している値は挿入されません。

    JSON Schemaバリデーターを使う理由

    値とルールの両方をたどる

    JSON Schemaバリデーターの報告にはデータ側とスキーマ側のパスが並びます。/users/0/ageの型違反なら値の位置を、requiredなら親オブジェクトと不足キーのパラメーターを確認できます。

    データの強調されたノードと別のルールツリーにある対応箇所を線で結んだ図。

    定義を別ファイルのまま使う

    共通定義を毎回ルートへ貼り付ける必要はありません。参照ファイルは絶対$idで登録し、相対参照は基準URIから解決します。ファイル名は表示用であり、参照先の推測には使いません。

    主スキーマから二つのローカル参照ファイルを経て検証結果につながる図。

    実行条件をそろえる

    01

    宣言と選択を一致させる

    初期値は2020-12です。$schemaの宣言と選択が異なればエラーになります。Draft-07のタプルはitems配列、2020-12はprefixItemsを使うため、選択変更だけで移行したことにはなりません。

    02

    データより先に定義を検査

    スキーマ検査は、ルートと読み込んだ全参照を解析し、メタスキーマ検査とコンパイルを行います。データ欄は読みません。参照ファイルには#を含まない一意の絶対$idを指定してください。

    03

    編集後は改めて実行

    Ctrl/Cmd+Enterで手動実行できます。入力や設定の変更は古い処理を中止し、エクスポートを無効にします。サンプル、消去、参照削除はプレビュー後に適用し、一度の取り消しで以前の入力と報告を戻せます。

    判定の仕組み

    三つのドラフトを明示して検証

    JSON SchemaバリデーターはAjvでDraft-07、2019-09、2020-12を処理します。条件分岐や組み合わせは選択した方言に従います。未知のキーワードはコンパイルエラーとなり、制約の見落としを成功扱いしません。

    formatを任意で有効化

    JSONバリデーションではformatが初期状態で無効です。有効にするとajv-formatsがemail、date-time、URI、UUIDなどを検査し、未知の形式は拒否します。独立したpatternの評価はこの設定で変わりません。

    定義の不備とデータ違反を分離

    JSONスキーマバリデータは構文、メタスキーマ、参照解決、インスタンス判定を区別します。完了した報告だけをコピーできます。画面の分類は日本語で、エンジンの技術メッセージは英語原文のまま残ります。

    パスと追加情報を一緒に読む

    検証は可能な箇所で早期終了しますが、組み合わせの失敗は複数行になる場合があります。instancePath、schemaPath、keyword、パラメーターを確認してください。表示は50件ずつ、ダウンロードは受理された報告全体です。

    使える範囲と制限

    参照URIを自動取得しない
    内部参照と読み込んだファイルだけを解決します。HTTPへの問い合わせはありません。参照ファイルには#なしの根絶対$idが必要で、重複IDはエラーです。同名ファイルでもIDが違えば代用できません。
    入力値を補正しない
    文字列から数値への変換、defaultの挿入、追加プロパティの削除は行いません。すべての文書でJSON5、コメント、末尾カンマ、重複キーを拒否し、上書きで消えた値を検証する事態を防ぎます。
    拡張仕様は対象外
    対応は三つのドラフトに限ります。独自メタスキーマ、$vocabulary、$async、$data、未知のキーワードは使えません。OpenAPI全体の検査ではなく、互換性のあるスキーマ部分を入力してください。 AjvのstrictSchema制限により、ifなしのthenなど無視されるルールも拒否される場合があります。properties、patternProperties、dependencies内のキーが厳密に__proto__の場合は未対応です。実データの同名キーはこの制限の対象外です。
    任意精度の数値演算ではない
    非有限値、安全範囲外の数学的整数、Numberとの往復で十進値が変わるトークンは拒否します。1.0や1e0は同値として扱えます。通常の小数もIEEE 754なので、multipleOfでは浮動小数点の境界が結果に影響します。
    文書と時間に上限
    各文書は500,000文字、50,000ノード、深さ40までです。合計1,000,000文字、参照は10ファイルまで。処理は5秒で打ち切られ、時間切れは未完了を意味し、有効・無効の判定にはなりません。
    全違反を列挙する保証はない
    allErrorsは無効です。報告された問題を直して再実行してください。報告の上限は1,000件と500,000文字で、超過時は報告全体が失敗します。一例の成功だけで将来の全入力を保証するものでもありません。

    JSON Schemaバリデーターのよくある質問

    対応するスキーマドラフトを選ぶには?

    $schemaの宣言と、利用先が採用するドラフトを確認してください。本ツールはDraft-07、2019-09、2020-12を選べます。初期値は2020-12ですが、既存の定義を自動変換する機能ではありません。

    /user/ageというパスは何を示しますか?

    JSON Pointerでuserオブジェクトのageを指します。配列なら/items/0のように添字が入ります。空文字列がルートであり、/は空の名前のキーを指す点に注意してください。

    ルートが配列のデータも検証できますか?

    はい。ルートをtype: arrayにしてitemsに要素のルールを定義します。単一スキーマのitemsは全要素に適用されます。位置ごとに違う条件ならドラフトに応じたタプル構文を使います。

    allOfとanyOfとoneOfはどう違いますか?

    allOfはすべて、anyOfは少なくとも一つ、oneOfはちょうど一つの分岐への適合を要求します。oneOfで二つの分岐に当てはまると失敗するため、重なりのある条件を点検してください。

    $refで別のスキーマを参照できますか?

    同一文書の定義と、読み込んだローカルファイルを参照できます。別ファイルの根には絶対$idが必要です。ネットワークからの取得は行わず、未登録の参照先はコンパイルエラーになります。

    確認したいスキーマの例がありますか?

    別の境界例も試す

    JSON Schemaバリデーターで成功例と失敗例を比べ、報告と一緒にドラフトとformatの設定も確認すると、環境による判定差を追いやすくなります。