JSON Schema バリデーター

JSON ドキュメントを JSON Schema (既定 Draft 2020-12)で検証。失敗箇所のパスと理由を表示。完全ブラウザ内処理(Ajv)。

Loading…

すべての処理はブラウザ内で実行されます — ファイルや入力はサーバへ送信されません。

使い方

左に JSON Schema、右に検証したい JSON ドキュメントを貼り付けてください。バリデーターは Ajv(Another JSON Validator、JS で最も使われるライブラリ)を `allErrors: true` で実行するため、最初の 1 件だけでなく失敗箇所がすべて報告されます。各エラーには失敗フィールドへの JSON Pointer、拒否したスキーマキーワード(`required`・`type`・`minLength`・`format` など)、人間が読めるメッセージが含まれます。検証は入力に応じて随時走るため、貼り付けて編集しながらエラーが消えたり現れたりするのを見られます。

API コントラクトの設計、公開されたスキーマに対するサンプルペイロードの検証、Webhook の受信側がボディを拒否し続ける原因の特定などに使ってください。本ツールは `ajv-formats` を同梱しており、標準フォーマットチェック(`email`・`date-time`・`uri`・`uuid`・`ipv4`・`regex`)がそのまま動きます。スキーマとデータはブラウザの外に出ません。社内フィールド名や個人情報を含むペイロードでも安心です。実行時に自前のコードで使う場合も、同じ Ajv ライブラリが多くのサーバ側 / CLI バリデーター(`ajv-cli`・NestJS の validation pipe・Fastify のスキーマなど)を動かしています。

基本的なユーザーオブジェクトの検証

入力
schema:
{
  "type": "object",
  "required": ["id", "email"],
  "properties": {
    "id":    { "type": "integer", "minimum": 1 },
    "email": { "type": "string", "format": "email" },
    "tags":  { "type": "array", "items": { "type": "string" }, "uniqueItems": true }
  }
}

data:
{ "id": 1, "email": "[email protected]", "tags": ["admin", "founder"] }
出力
✓ valid

スキーマは 1 以上の整数 `id` と email 形式の `email` を必須とし、`tags` は任意ですが、ある場合は一意の文字列配列であることが必要です。データは 3 条件を満たすため検証は静かに通ります。email を `"alice"` に変えれば `format` キーワードが発火し、`id` を削れば `required` が文句を言います。

複数のエラーを同時に表示

入力
schema: (same as above)

data:
{ "id": -3, "email": "not-an-email", "tags": ["a", "a"] }
出力
✗ 3 errors
/id     minimum  must be >= 1
/email  format   must match format "email"
/tags   uniqueItems  must NOT have duplicate items (items ## 1 and 0 are identical)

`allErrors: true` により、最初の失敗で止まらず全ての違反が同時に表に出ます。JSON Pointer(`/id`・`/tags` など)が失敗フィールドを指し示し、`keyword` 列がどのスキーマルールが発火したかを示すため、スキーマソースを grep ですぐに辿れます。

`$ref` と `$defs` を含むスキーマ

入力
schema:
{
  "$defs": {
    "Address": {
      "type": "object",
      "required": ["city"],
      "properties": { "city": { "type": "string" }, "zip": { "type": "string", "pattern": "^[0-9]{5}$" } }
    }
  },
  "type": "object",
  "properties": {
    "home":   { "$ref": "#/$defs/Address" },
    "office": { "$ref": "#/$defs/Address" }
  }
}

data:
{ "home": { "city": "Seoul" }, "office": { "city": "Tokyo", "zip": "100-0001" } }
出力
✗ 1 error
/office/zip  pattern  must match pattern "^[0-9]{5}$"

`$defs`(2019-09 以前は `definitions`)は再利用可能なサブスキーマを保持し、`$ref` がそれらを JSON Pointer で取り込みます。東京の郵便番号 `100-0001` は日本の形式(ハイフン入り)ですが、スキーマは米国の 5 桁形式を強制しています。パターンを緩める(`^[0-9-]{5,8}$`)か、米国向け・日本向けの 2 つのアドレススキーマを `oneOf` で構成するかのいずれかです。

よくある質問

どの JSON Schema ドラフトに対応していますか?

本ツールが採用する Ajv 8 の既定は Draft 2020-12 で、2026 年半ば時点の最新公開ドラフトです。スキーマ先頭の `$schema` 宣言を適切に設定すれば Draft 2019-09・07・06 も読めます。07 と 2019-09 の大きな変更点は、`definitions` を `$defs` に改名したこと、`$anchor` を追加したこと、`$ref` と同階層キーワードの関係を整理したことです。ツール連鎖が今も Draft 07 を出力するなら、`"$schema": "http://json-schema.org/draft-07/schema#"` を指定するとバリデーターがモードを切り替えます。

JSON Schema と OpenAPI の関係は?

OpenAPI はリクエスト / レスポンス本体やパラメータの型システムに JSON Schema を採用していますが、注意点があります。OpenAPI 3.0 は Draft Wright-00 の *部分集合* に独自拡張(`nullable`・`discriminator`・`xml` など)を加えたものを採用しています。OpenAPI 3.1(2021 年 5 月)は JSON Schema 2020-12 と完全に整合しました。つまり 3.0 のスキーマはおおむね移植可能ですが厳密な JSON Schema ではなく、3.1 のスキーマはそのまま検証できます。移行時の代表的な落とし穴は `nullable: true`(`type: [..., "null"]` に置き換え)と、`example` の廃止(配列の `examples` に置換)です。

`format: "email"` は実際に何を検証しますか?

実用的な正規表現で文字列の構文を検査するだけで、RFC 5321 への完全準拠は確認しません。人がふだん入力するアドレスのほとんどは通ります。少数の珍しいが合法な形(`"hello world"@example.com` のような引用付きローカル部、IP リテラルのホスト部など)は弾かれます。JSON Schema は `format` を意図的に半端に定義しており、実装ごとに厳格度を選べる余地を残しています。「典型的な email っぽい形」と見るのが妥当で、「実在し配達可能なアドレス」を確かめたいなら実際にメールを送ってバウンスを確認するしかありません。

エラーメッセージが存在しないパスを参照するのはなぜですか?

よくある原因は 2 つです。`additionalProperties: false` で予期しないフィールドが現れると、未知フィールドのパスではなく親パスに対するエラーとして出ます。バリデーターがそのフィールドを何と呼ぶべきか知らないためです。`anyOf` / `oneOf` の場合、失敗した各ブランチに対してエラーが報告されるため、1 件の不正値が 3〜4 行のエラーを生成し、それぞれが同じ場所を別の角度から指すことがあります。`keyword` 列を読み、自分が実際に満たしたかったブランチを特定してください。

スキーマからサンプルデータを生成できますか?

いいえ。本ツールは検証専用です。スキーマからのモック生成は別の問題(`json-schema-faker`・`Mockoon`・`jsf` CLI など)で、妥当なデフォルトの推定、制約内でのランダム化、`enum` / `format` の賢い扱いなどが絡みます。検証は通っても構成的な解が存在しないスキーマ(例: `not: { type: "string" }` は文字列以外を受け入れる)もあり、良い生成器はこれらを優雅に処理します。

strict モードがオフになっています — 影響はありますか?

Ajv の strict モードは、未知のキーワードや認められない構文(文字列以外の `type` に対する `format` キーワードなど)を含むスキーマを拒否します。本ツールは strict をオフにして実行するため、より緩い仕様で書かれたスキーマ(古いドラフト、OpenAPI 専用の拡張を含むスキーマ、手書きのショートカットなど)も受け入れます。代償として、キーワード名のタイポが検出されません。`required` を `requried` と書いても黙って何もしません。新規スキーマを書くときは、自前のコードで別途 Ajv の strict モードを通してください。

関連する概念

JSON Schema は JSON データの「形」を記述するための語彙です。どのフィールドが必要か、どの型を取るか、どの値が許されるか、配列の構造がどうあるべきか、などです。仕様のドラフトは 2026 年時点で Draft 2020-12 で *停止* しており、2022 年に標準化トラックが IETF に移されたものの、現時点で正式な RFC はまだ出ていません。それでも主要なエコシステム(Ajv・Python の jsonschema・Swagger / OpenAPI 3.1・AWS API Gateway・JSON Forms など)は 2020-12 か前任の 2019-09 を実装しています。古いコードは依然として 2018 年の準 LTS 的チェックポイントだった Draft 07 を参照することがあります。

語彙は大きく 4 領域をカバーします。**構造**: `type`・`properties`・`required`・`items`・`additionalProperties`・`patternProperties`。**制約**: `minimum`・`maximum`・`minLength`・`maxLength`・`pattern`・`uniqueItems`・`enum`・`const`。**合成**: `allOf`(すべて満たす)・`anyOf`(少なくとも 1 つ)・`oneOf`(ちょうど 1 つ)・`not`・`if / then / else`。**再利用**: 名前付きサブスキーマの `$defs`、JSON Pointer か絶対 URI で参照する `$ref`、安定した名前付き対象を作る `$anchor`。実運用のスキーマで使われるキーワードは合計 5〜10 個程度で、ロングテールは主に仕様自身の自己記述やエッジケース向けに存在します。

隣接する 3 つの考え方があります。**OpenAPI**(旧 Swagger)は JSON Schema を HTTP API 記述フォーマットで包んだもので、3.1 が完全準拠、3.0 は分岐した部分集合です。**TypeScript の型** はコンパイル時に同様の領域を扱いますが、ランタイム側はブリッジ(`zod`・`io-ts`・`runtypes`・`valibot`・`typia` など)が必要です。TypeScript はコンパイル時に消えてしまうためです。**Protocol Buffers** と **GraphQL SDL** は同じ問題を異なる構文で解きます。protobuf はスキーマ + バイナリのワイヤフォーマット、GraphQL はスキーマ + クエリ言語というアプローチです。JSON Schema が勝つのは、すでに JSON を扱っていて、トランスポートを書き換えずに検証を載せたい場合です。

関連記事

関連ツール