JSON Schema 検証
開発ツール
読み込み中
ツールを読み込んでいます
ツールのコードは開いたときにのみ読み込まれます。
このツールの処理はすべてブラウザー内で行われ、入力内容はサーバーへ送信されません。
このツールについて
本ツールは選択した JSON Schema 仕様の制限付きサブセットに対応し、非対応機能は明示的に拒否します。Draft 7、2019-09、2020-12 を明示的に選び、対応する仕様で JSON 文書を検証します。使い捨てのブラウザーワーカーが解析、コンパイル、検証をローカルで行い、起動を含めて 2 秒で停止します。文書の不適合、使用できないスキーマ、未対応の機能、未完了の処理は区別されます。診断には文書のパス、スキーマのパス、キーワードが含まれ、元の値や例外本文は含まれません。ただし、プロパティ名が機密情報を明かすことがあります。
主な用途
- スキーマの導入前に、API のサンプルデータの必須プロパティ、型、配列制約を確認する。
- 外部スキーマの取得やサーバー処理を行わず、仕様による動作の違いを比べる。
- プロパティ名のパスに私的な情報がないか確認してから、簡潔な診断を共有する。
使い方
- 1.スキーマの仕様を選びます。$schema がある場合は選択した仕様と一致させてください。例のメニューはスキーマと文書を読み込み、対応する仕様も選択します。
- 2.最初の欄に厳密な JSON のスキーマオブジェクトまたは真偽値、文書の欄に任意の JSON 値を入力し、検証します。入力や仕様の変更、例の読み込み、消去は前の実行を停止し、古い結果を消します。
- 3.まず結果の状態を確認します。文書が無効なら、各キーワード、文書の JSON Pointer、スキーマのパスを確認してください。required のエラーは対象プロパティを含むはずのオブジェクトを指します。 パスを確認してから診断 JSON をコピーまたは保存します。タイムアウト、キャンセル、安全上の制限は、文書の適合・不適合を確定しません。
実行できるスキーマと文書の例
有効なオブジェクト
{
"draft": "draft7",
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"age": {
"type": "integer",
"minimum": 0
}
},
"required": [
"name"
],
"additionalProperties": false
},
"instance": {
"name": "Avery",
"age": 28
}
}{
"status": "valid",
"keywords": []
}name があり、両方の値の型も正しいため有効です。additionalProperties: false は余分なプロパティを拒否します。例の入力 JSON は 3 つの UI 項目を表し、schema と instance は別々に入力します。
必須プロパティの欠落
{
"draft": "draft7",
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"age": {
"type": "integer",
"minimum": 0
}
},
"required": [
"name"
],
"additionalProperties": false
},
"instance": {
"age": 28
}
}{
"status": "invalid",
"keywords": [
"required"
]
}age は任意ですが name は必須です。required で失敗し、パスは対象オブジェクトを指す空文字列になります。
整数ではなく文字列
{
"draft": "draft7",
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"age": {
"type": "integer",
"minimum": 0
}
},
"required": [
"name"
],
"additionalProperties": false
},
"instance": {
"name": "Avery",
"age": "28"
}
}{
"status": "invalid",
"keywords": [
"type"
]
}age が JSON 文字列なので、/age の type で失敗します。自動的に数値へ変換しません。
配列要素の重複
{
"draft": "2019-09",
"schema": {
"type": "array",
"items": {
"type": "integer"
},
"minItems": 2,
"uniqueItems": true
},
"instance": [
1,
1
]
}{
"status": "invalid",
"keywords": [
"uniqueItems"
]
}どちらも整数で要素数も 2 ですが、uniqueItems が重複を拒否します。診断のキーワードは uniqueItems です。
ローカルの $defs 参照
{
"draft": "2020-12",
"schema": {
"$defs": {
"positive": {
"type": "integer",
"minimum": 1
}
},
"type": "object",
"properties": {
"count": {
"$ref": "#/$defs/positive"
}
},
"required": [
"count"
]
},
"instance": {
"count": 3
}
}{
"status": "valid",
"keywords": []
}count は同じスキーマ内の #/$defs/positive を参照し、値は integer と minimum を満たします。ネットワーク取得は不要です。
Draft 7 は $ref の隣接制約を無視
{
"draft": "draft7",
"schema": {
"$ref": "#/definitions/value",
"definitions": {
"value": {
"type": "string"
}
},
"minLength": 3
},
"instance": "ok"
}{
"status": "valid",
"keywords": []
}Draft 7 は参照先の文字列スキーマを使い、$ref の隣の minLength を無視します。2 文字の文書は有効です。次の例は同じスキーマとデータを使います。
2020-12 は $ref の隣接制約を評価
{
"draft": "2020-12",
"schema": {
"$ref": "#/definitions/value",
"definitions": {
"value": {
"type": "string"
}
},
"minLength": 3
},
"instance": "ok"
}{
"status": "invalid",
"keywords": [
"minLength"
]
}2020-12 は $ref の隣の minLength も評価するため、同じ 2 文字の文書は minLength で失敗します。両仕様で同じスキーマと参照を使うため、ここでは definitions を保持しています。
よくある検証の間違い
- Draft 7 を宣言するスキーマに 2020-12 を選ぶ、または仕様が自動判定されると思い込む。
- properties だけでプロパティが必須になると思う。存在を必須にするには required を使います。
- 文字列 "28" が type: integer を満たすと思う。本ツールは型変換しません。
- 外部 $ref URL や未知の拡張キーワードが検証されたと思い込む。
- format の注釈を形式検証とみなす、またはタイムアウトを有効とみなす。
- 公開されるプロパティ名を確認せず、パスのみのレポートを共有する。
制限と注意事項
- 対応仕様は Draft 7、2019-09、2020-12 で、$schema 宣言は選択した仕様と一致する必要があります。# で始まり、入力したスキーマ内で解決できるフラグメント参照のみ許可します。外部スキーマは取得しません。未知・独自のキーワード、独自仕様、$vocabulary、$async、OpenAPI の nullable は非対応です。エンジンの制限により、スキーマのマップ内の __proto__ エントリーも拒否します。文書のキーは通常の入力データとして扱います。 入れ子の $id リソースは非対応ですが、ルートの $id は使用できます。 ローカルエンジンがすべての組み合わせを正確に扱えないため、unevaluatedItems と unevaluatedProperties は明示的に非対応です。 $dynamicRef、$dynamicAnchor、$recursiveRef、$recursiveAnchor も非対応です。通常のローカル $ref による再帰は使用できます。 エンジンの解釈が曖昧になるため、参照フラグメント内のパーセント符号化されたスラッシュ(%2F)は非対応です。プロパティ名に含まれるスラッシュには JSON Pointer の ~1 を使ってください。 dependencies と dependentRequired の配列は空文字列のプロパティ名を含められません。required 配列では使用できます。
- format は注釈のみとして扱います。format: "email" は不正なメールアドレス文字列を拒否しません。型変換、既定値の補完、追加プロパティの削除は行いません。有効という結果は選択した仕様と本ツールの範囲に限られ、業務規則や別の検証器の設定まで保証しません。
- 各入力は UTF-8 で 200,000 バイト、深さ 64、JSON 値 20,000 個までです。正規表現は 512 文字まで。コンパイルと検証は使い捨てワーカーで行い、起動を含めて 2,000 ミリ秒までです。複雑なスキーマ、再帰参照、重い正規表現は制限やタイムアウトに達する場合があり、有効と推定してはいけません。 2 秒の期限はブラウザーのタイマーであり、バックグラウンドタブでは終了が遅れる場合があります。ワーカーは UI の実行を分離しますが、メモリーのサンドボックスではありません。 追加の複雑さの制限として、スキーマのオブジェクトは 512 個、直接の子スキーマ一覧は各 512 要素までです。文書の JSON 値数とスキーマのオブジェクト数の積を保守的な推定処理量とし、200,000 までに制限します。エラーは網羅的ではなく、評価した分岐ごとの最初の失敗を返すため、修正後に別のエラーが見つかる場合があります。 1 回の実行は重み付き検証処理 50,000 単位までに制限します。直接の子スキーマ数と現在の文書コレクションの要素数を考慮し、参照による反復的・指数的な処理を抑えます。
- 復号後の重複オブジェクトキー、安全でない整数、非有限数へのオーバーフロー、非ゼロ値がゼロになるアンダーフローは検証前に拒否します。他の小数は JavaScript の IEEE-754 数値となり、丸められる場合があります。任意精度の JSON 演算は行いません。正確さが必要な大きな識別子は文字列と対応するスキーマで表してください。
- 診断は 100 件まで、各パスは 2,048 文字までです。省略の通知がある場合、詳細は完全ではありません。レポートはパスとキーワードを含み、元の値、検証器のパラメーター、生の解析エラーを含みません。パスに個人を識別できるプロパティ名がある場合があり、匿名化は保証されません。 入力は読み込み済みのページで処理され、アップロードや永続保存は行いません。キャンセル、再実行、入力変更、ツールからの移動時にワーカーを終了します。クリップボードのコピーや保存ファイルはページの管理外です。本ツールは制限付きのローカル実装であり、無制限の JSON Schema 準拠を主張するものではありません。
よくある質問
同じスキーマでも仕様によって結果が違うのはなぜですか?
キーワードの意味は仕様によって変わります。Draft 7 は $ref に隣接する検証キーワードを無視しますが、2019-09 と 2020-12 は評価します。対になる例は同じ $ref、minLength、文字列 "ok" を使い、Draft 7 は有効、2020-12 は minLength で無効です。タプルも、旧仕様の items 配列から 2020-12 の prefixItems に変わっています。
format: email や date-time は文字列の形式を検証しますか?
いいえ。本ツールはどの仕様でも format を注釈として扱います。メールアドレスや日時として不正な文字列でも有効になる場合があります。本番の検証器で形式検証が有効なら結果が異なる可能性があるため、そちらでも確認してください。
文書が無効な場合とスキーマが無効な場合はどう違いますか?
文書が無効とは、検証を実行して少なくとも一つの制約を満たさなかった状態です。スキーマが無効とは、解析、メタスキーマによる確認、コンパイルのいずれかができなかった状態です。未対応、タイムアウト、キャンセル、制限による停止は別の結果で、意図したスキーマへの適合性を確定しません。 unevaluatedItems と unevaluatedProperties は非対応です。同梱エンジンが一部の注釈の組み合わせで誤った結果を返すため、明示的に拒否します。必要な場合は、対応が検証された別の検証器を使ってください。3 種類の仕様は本ツールの制限付きの対応範囲を示し、無制限の語彙への準拠を保証しません。 $dynamicRef、$dynamicAnchor、$recursiveRef、$recursiveAnchor も非対応です。通常のローカル $ref による再帰は使用できます。 選択した仕様の制限付きサブセットに対応します。スキーマのオブジェクトは 512 個、直接の子スキーマ一覧は各 512 要素までで、文書の値数 × スキーマのオブジェクト数は 200,000 以下です。診断は全違反ではなく、評価した分岐ごとの最初の失敗を示します。 1 回の実行は重み付き検証処理 50,000 単位までに制限します。直接の子スキーマ数と現在の文書コレクションの要素数を考慮し、参照による反復的・指数的な処理を抑えます。
診断レポートは確認せず公開しても安全ですか?
いいえ。元の値や例外本文は省かれますが、プロパティ名に人名、識別子、秘密情報が含まれる場合があります。共有前に文書とスキーマの両方のパスを確認してください。空の文書パスはルートです。JSON Pointer は / を ~1、~ を ~0 と表します。 エンジンの解釈が曖昧になるため、参照フラグメント内のパーセント符号化されたスラッシュ(%2F)は非対応です。プロパティ名に含まれるスラッシュには JSON Pointer の ~1 を使ってください。 参照先の検証器が返すパスは、元のルートではなく参照先スキーマを基準にする場合があります。
- JSON Schema:仕様の宣言
- JSON Schema:参照と $ref の隣接キーワード
- JSON Schema:配列の制約と仕様の違い
- JSON Schema:オブジェクトのプロパティと required
- Ajv:JSON Schema の対応と仕様
- RFC 6901:JSON Pointer