JSON Schema 検証: エラーをパスと理由つきで確認
スキーマと JSON データを貼り付けると、JSON Schema 検証の結果がすぐに表示されます。一致しない場合は、失敗した値までのパスと分かりやすい理由が、エラーごとに $.users[0].email のように並びます。draft-07、2019-09、2020-12 に対応しており、2つの入力欄の内容はお使いの端末から出ません。
JSON スキーマチェックの手順
- JSON スキーマの入力欄にスキーマを貼り付けます(欄には「ここに JSON スキーマを貼り付けてください...」と表示されています)。
- JSON データの入力欄に、チェックするデータを貼り付けます。
- 結果を読みます。貼り付けた直後、または入力をやめて約 300 ミリ秒後に更新されるので、押すボタンはありません。
- 緑の有効と「JSON データはスキーマに一致しています。」が出れば、データは合格です。赤い「無効: エラー 3 件」が出た場合は、失敗した箇所が1件ずつ一覧に並びます。
- データ(またはスキーマ)を直すと、編集に合わせて結果が変わります。
2つの欄がそろうまでは、結果に「スキーマと JSON データを貼り付けると、チェックします。」と表示されます。どちらかの欄に JSON ではないテキストが入っていると、赤いJSON が正しくありませんの枠に理由と「X 行目、Y 列目」が表示され、どちらを直すかも結果に出ます。先に乱れた文書を整えたいときは、「JSON整形ツール」が壊れた JSON に対して同じ行と列を示します。
エラーの読み方: パスと理由
エラーはパスと理由の2つでできています。パスはデータのルートである $ から始まり、プロパティ名をドットでつなぎ、配列の位置を 0 から数えて角括弧で示します。例として、スキーマが id を 1 以上の整数、email を email 形式、tags を重複なしと定めていて、データが {"id":"7","email":"ana@","tags":["a","a"]} だとします。結果は「無効: エラー 3 件」になります。
$.id: 整数である必要がありますが、文字列になっています。$.email: 形式「email」に一致する必要があります。$.tags: 要素 [0] と [1] が同じですが、すべての要素が異なる必要があります。
最初の1件だけでなくすべてのエラーが一覧に出るので、文書全体を一度に直せます。100 件を超えると、一覧の最後に「ほかに 250 件のエラーがありますが、表示していません」のような行が付き、見出しの件数は正確なままです。必須プロパティ(required)がない場合、エラーはそのプロパティを持つはずのオブジェクトのパス(たとえば $.users[0])に表示されます。not、contains、propertyNames、dependentRequired、if/then/else のようなあまり使われないキーワードにも、それぞれ分かりやすい理由が用意されています。
厳格モード: additionalproperties false
JSON Schema は初期状態では余分なプロパティを許します。スキーマに載っていない nick という欄がデータにあっても、そのまま合格します。厳格モード(「スキーマに載っていないプロパティがデータにあると、失敗にします。」)をオンにすると、打ち間違いや消し忘れを見つけられます。前の例のスキーマと、データ {"id":1,"email":"ana@example.com","nick":"x"} の場合、モードがオフなら「有効」、オンなら $ で「無効: エラー 1 件」(想定外のプロパティ「nick」です)となります。
スイッチの裏では、ルートのスキーマと、オブジェクトを表すプロパティや要素のスキーマごとに unevaluatedProperties: false が追加されます。$ref をまたいでも働きます。入力欄のテキストが書き換えられることはありません。
- すでに
additionalPropertiesやunevaluatedPropertiesを設定しているスキーマは、その設定のままです。 propertiesのない自由形式の{"type":"object"}は開いたままです。allOf、anyOf、oneOfの各分岐と$defsの項目はそれ自体では固定されないので、並んだ分岐がそれぞれ独自のプロパティを宣言できます。
JSON Schema draft 7・2019-09・2020-12 のバージョンと $ref
スキーマの "$schema" の行を読み取り、対応するルールでデータをチェックします。http://json-schema.org/draft-07/schema# は draft-07、https://json-schema.org/draft/2019-09/schema は 2019-09、https://json-schema.org/draft/2020-12/schema は 2020-12 として扱います。"$schema" がない場合は 2020-12 です。items に配列を使う古い書き方のときは 2019-09 になります。draft-04、draft-06、そのほかのアドレスには対応しておらず、結果にはスキーマが宣言したアドレスが表示されます。バージョンごとにキーワードが変わっているためです。prefixItems は 2020-12 のもので、definitions は 2019-09 で $defs になりました。参照パスは #/$defs/name と #/definitions/name のどちらの書き方でも使えます。
$refは同じスキーマの中だけをたどります。何もダウンロードしないため、https://example.com/address.jsonのような外部参照は「スキーマが定義していない参照」として報告されます。そのスキーマを自分の$defsに貼り付け、$refをそちらに向けてください。formatは無視されずにチェックされます。email、date、date-time、uri、uuid などよく使う形式は、一致しないと「形式に一致する必要があります」と表示されます。- スキーマが壊れていると、「スキーマ自体が正しくありません」と、スキーマ内の位置を指す問題とパスが表示されます(たとえば
"type": "strng")。スキーマを直すまで、データはチェックされません。正しい正規表現ではないパターンがあると「スキーマを使用できませんでした」と表示されます。
制限事項とプライバシー
- 各入力欄に入れられるのは最大 5,000,000 文字です。これを超えると、結果に「もっと短い部分を貼り付けてください」と案内されます。
- 一覧に表示されるのは最初の 100 件のエラーですが、合計件数は常に数えられます。
- 対応しているのは JSON だけです。YAML や OpenAPI のファイル全体は、先に変換してください。このツールは検証するだけで、データからスキーマを作ったり、データを直したりはしません。
- 数値は
JSON.parseと同じ方法で読み取られるため、9,007,199,254,740,991 を超える整数は、チェックの前に精度が失われます。 - スキーマとデータはお使いのブラウザ内でチェックされます。アップロードも保存もされません。
よくある質問
JSON Schema 検証をオンラインで行うには、どうすればいいですか?
「JSON スキーマ」の入力欄にスキーマを、「JSON データ」の入力欄にチェックするデータを貼り付けます。結果は貼り付けた直後、または入力をやめて約 300 ミリ秒後に表示されます。緑の「有効」はデータが一致していることを、赤い「無効」は各エラーのパスと理由を示します。押すボタンはありません。
どの JSON Schema のバージョンに対応していますか。draft-07、2019-09、2020-12 のどれですか?
3つとも対応しています。バージョンはスキーマの「$schema」の行から判断されます。「$schema」のないスキーマは 2020-12 として、items に配列を使う古い書き方のときは 2019-09 としてチェックされます。draft-04、draft-06、そのほかの $schema のアドレスを宣言したスキーマは、非対応として報告されます。
$.users[0].email のようなパスは何を意味しますか?
失敗した値の場所です。$ は JSON データのルート、.users は users というプロパティ、[0] はその配列の最初の要素(数え始めは 0)、.email はその中のプロパティを表します。$.users[2].address.zip のようなパスも、同じように一段ずつ値までたどります。
必須プロパティがないエラーが、なぜ親のオブジェクトに表示されるのですか?
ないプロパティには、指し示す先がないからです。エラーは、そのプロパティを持つはずのオブジェクトのパス(たとえば $.users[0])に、「必須プロパティ「email」がありません。」という理由で表示されます。そのオブジェクトにプロパティを追加すれば、エラーは消えます。
スキーマに余分なプロパティを拒否させるには(additionalproperties false)?
「厳格モード」をオンにします。ルートのスキーマと、オブジェクトを表すプロパティや要素のスキーマごとに unevaluatedProperties: false が追加され、スキーマに載っていないプロパティは「想定外のプロパティ」で失敗します。additionalProperties や unevaluatedProperties をすでに設定しているスキーマは、その設定のままです。
email、date-time、uri、uuid などの形式もチェックされますか?
はい。「format」キーワードはチェックされるので、ana@ のようなアドレスは「format」: 「email」の文字列では失敗し、「形式「email」に一致する必要があります。」と表示されます。email、date、date-time、time、uri、uuid、ipv4、ipv6、hostname など、よく使う形式に対応しています。
$ref で別のファイルや URL を参照できますか?
同じスキーマの中、たとえば #/$defs/name や #/definitions/name だけです。何もダウンロードしないため、https://example.com/address.json のような参照は、スキーマが定義していない参照として報告されます。参照先のスキーマを自分の $defs にコピーして、$ref をそちらに向けてください。
「スキーマ自体が正しくありません」とはどういう意味ですか?
スキーマが JSON Schema の規則に反しています。たとえば「type」: 「strng」や、文字列で書かれた「minimum」などです。結果には、スキーマ内の位置を指すパスつきで問題が並びます。スキーマを直すまで、データはチェックされません。
スキーマや JSON データはどこかにアップロードされますか?
いいえ。スキーマもデータもすべてブラウザ内でチェックされます。アップロードも保存もされず、アカウントも必要ありません。
おすすめ
-
エレコム ノートPCスタンドエラーが長く並んでも、画面を目の高さに上げれば首を痛めず読めます。
-
Webを支える技術APIのレスポンスがなぜスキーマ通りにならないのか、HTTPとRESTの土台から理解できます。
-
ロジクール MX MASTER 3S ワイヤレスマウススキーマとデータのコピペ、エラー行のスクロールを、手元でスムーズにこなせます。
無料でツールを続ける支えになります。✨
画像はイメージです。 Amazonのアソシエイトとして、Capsule Toolsは適格販売により収入を得ています。