JSON Schema バリデーター
JSON を任意の JSON Schema に対してブラウザで即座に検証。Draft 2020-12 / 2019-09 / Draft-07 をサポートし、エラーメッセージは JSON Pointer パスで正確に位置を示します。100% プライベート、アップロード不要、無料。
JSON Schema バリデーターとは?
JSON Schema バリデーターは、データドキュメントと schema ドキュメントの 2 つの JSON を受け取り、データが schema の契約に従っているかを報告するプログラムです。Schema は固定語彙(type、properties、required、items、enum、oneOf、allOf、$ref、format)を使って、フィールド型、必須キー、値の範囲、許容 enum 値、正規表現 pattern、構造ルールを宣言します。バリデーターは両ドキュメントを並行して走査し、0 個以上のエラーを返します。各エラーはデータ内部の JSON Pointer パスにピン留めされます。
検証は実行時に、信頼できない入力とコードの境界で実行されます。TypeScript の型はコンパイル時に消えるため、webhook、サードパーティ API、ユーザーの貼り付けから来る JSON には無力です。そのギャップを埋めるのが JSON Schema です。TypeScript(または Python の Pydantic)と組み合わせれば、コードベース内部のコンパイル時保証と境界での実行時保証の両方を得られます。
Draft 2020-12 が現行仕様で、2026 年の新規プロジェクトはこれを選ぶべきです。古い Draft(2019-09、Draft-07、Draft-06、Draft-04)はレガシーコードに残り続けています。Draft-07 は Helm chart、VS Code 設定、古い Ajv 設定で今も一般的です。OpenAPI 3.1 はネイティブで Draft 2020-12 を、OpenAPI 3.0 は Draft 4 のサブセットを使います。
このツールは完全にブラウザ内で動作します。JSON、schema、検証出力はマシンを離れず、社内 API 契約や機微な payload にも安心です。内部 $ref ポインターは自動解決され、外部 HTTP ref はプライバシー保護のため意図的に無効化されています。
隣接する JSON ツールと併用する場合:貼り付け前に JSON フォーマッター で整形し、JSON Diff で 2 つの JSON を比較し、JSON → YAML や YAML → JSON で形式を変換できます。Node・Python・ブラウザの一連の検証例は JSON Schema 検証ガイド をご覧ください。
// A 5-line schema that catches three real bugs
const schema = {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": { "type": "integer", "minimum": 1 },
"email": { "type": "string", "format": "email" },
"age": { "type": "integer", "minimum": 0, "maximum": 150 }
},
"required": ["id", "email"],
"additionalProperties": false
};
// Three bugs the schema catches:
const bad = { "id": "42", "age": 200 };
// /id → type: expected integer, got string
// /email → required: missing
// /age → maximum: 200 > 150
// In Node: new Ajv().compile(schema)(bad) // false; ajv.errors has the paths
// In Python: jsonschema.validate(bad, schema)
// In the browser: this tool — same errors, same paths, no install 主な機能
マルチ Draft 対応
Draft 2020-12(デフォルト)、2019-09、Draft-07 に対応。Schema の $schema URI から Draft を自動判別し、未指定時はフォールバック用セレクターを使用します。
パス精密なエラー
全エラーに JSON Pointer(例:/user/email/0)、失敗 keyword(type、required、pattern)、1 行の説明が付きます。クリックで該当箇所へジャンプできます。
ライブ検証
入力中に検証します。エラーがリアルタイムで更新され、Validate ボタンを往復することなく schema やデータを反復調整できます。
format keyword 完備
email、uri、uuid、date、date-time、ipv4、ipv6、hostname、regex — 実運用で使う format を、実戦投入された pattern で検証します。
100% ブラウザ動作
入力はマシンを離れません。アップロードなし、貼り付け内容の解析なし、JSON の localStorage 保存なし。社内契約や機微 payload に安全です。
サンプル schema をワンクリック
プリセット(サインアップフォーム、Webhook エンベロープ、設定ファイル、注文配列)を読み込めば、5 秒以内に動作する検証状態に到達できます。
例
有効なオブジェクト — required + 型チェック
{
"id": 42,
"email": "alice@example.com",
"age": 30
} {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": { "type": "integer", "minimum": 1 },
"email": { "type": "string", "format": "email" },
"age": { "type": "integer", "minimum": 0, "maximum": 150 }
},
"required": ["id", "email"],
"additionalProperties": false
} Schema は id と email を required に指定し、型を固定しています。上のデータはすべての制約を満たすため検証を通過します。email を消したり id を文字列に変えたりすると、パス付きのエラーが確認できます。
無効 — required 欠落 + 型違反
{
"id": "42",
"age": 200
} {
"type": "object",
"properties": {
"id": { "type": "integer" },
"email": { "type": "string", "format": "email" },
"age": { "type": "integer", "maximum": 150 }
},
"required": ["id", "email"]
} エラーは 3 件:/id は string で integer ではない、/email が欠落、/age(200)が maximum 150 を超過。各エラーには正確な JSON Pointer パスが付くため、推測なしでデータを修正、または schema を緩める判断ができます。
判別ユニオン — oneOf と const
{
"type": "order.created",
"data": { "orderId": "ORD-001234", "totalUsd": 49.99 }
} {
"oneOf": [
{
"properties": {
"type": { "const": "order.created" },
"data": {
"type": "object",
"properties": {
"orderId": { "type": "string", "pattern": "^ORD-[0-9]{6}$" },
"totalUsd": { "type": "number", "minimum": 0 }
},
"required": ["orderId", "totalUsd"]
}
},
"required": ["type", "data"]
},
{
"properties": {
"type": { "const": "order.refunded" },
"data": { "type": "object", "required": ["refundId"] }
},
"required": ["type", "data"]
}
]
} Webhook エンベロープの検証例です。type が "order.created" のため最初の oneOf ブランチに一致します。type を "order.refunded" に変えたり orderId の pattern を崩すと、oneOf がブランチごとに失敗を報告する様子を確認できます。
オブジェクトの配列 — items + uniqueItems
[
{ "sku": "A1", "qty": 3 },
{ "sku": "B2", "qty": 5 },
{ "sku": "A1", "qty": 3 }
] {
"type": "array",
"minItems": 1,
"uniqueItems": true,
"items": {
"type": "object",
"properties": {
"sku": { "type": "string", "pattern": "^[A-Z][0-9]+$" },
"qty": { "type": "integer", "minimum": 1 }
},
"required": ["sku", "qty"]
}
} 2 件のアイテムがバイト一致のため uniqueItems が発火します。インデックス 0 と 2 が重複し、バリデーターは配列ルートで重複を報告します。カートの行重複やマージバグによる発送リクエストの検出に有効です。
使い方
- 1
JSON Schema を貼り付ける
Schema を右パネルに投入してください。$schema URI があればバリデーターが Draft を自動判別し、なければツールバーで Draft 2020-12 / 2019-09 / Draft-07 を選択します。
- 2
JSON データを貼り付ける
検証したい JSON ドキュメントを左パネルに投入します。入力中に検証が走り、200 KB を超える大きな入力は手動 Validate ボタンに切り替わって入力がもたつかないようにします。
- 3
エラーリストを読む
各エラーには JSON Pointer パス、keyword、1 行の説明が含まれます。エラーをクリックして該当箇所へジャンプし、修正するとエラー数がリアルタイムで減少します。
JSON Schema のよくある落とし穴
type: integer と number の違い
JSON Schema は 1.0 を number として扱い integer とは見なしません。契約に integer と書けばバリデーターは 1.0 を拒否します。多くの言語が 1 と等しいと言ってもです。本当に integer が必要でなければ number を選びましょう。
{ "qty": 1.0 } schema: { "type": "integer" } → error: not an integer { "qty": 1 } schema: { "type": "integer" } → valid required を誤った入れ子レベルに置く
required は properties と同じ階層に置く必要があり、property 宣言の中ではいけません。property 内の required 配列は黙って無視され、バリデーターは強制しません。
{ "properties": { "name": { "type": "string", "required": true } } } { "properties": { "name": { "type": "string" } }, "required": ["name"] } additionalProperties の既定値は true
additionalProperties: false がない schema は開放型で、追加キーは何でも通過します。「schema が何でも受け入れる」最も多い原因です。
{ "properties": { "id": { "type": "integer" } } } accepts: { "id": 1, "foo": "bar", "x": null } { "properties": { "id": { "type": "integer" } }, "additionalProperties": false } OpenAPI 3.0 nullable と Draft 2020-12 type 配列
OpenAPI 3.0 は nullable: true、Draft 2020-12 は type: ["string", "null"] を使います。混ぜると見た目は正しいのに実際には null を許可しない schema が出来上がります。
{ "type": "string", "nullable": true } in 2020-12: nullable is just an unknown keyword { "type": ["string", "null"] } in 2020-12: explicitly allows null アンカーのない pattern
JSON Schema の正規表現は既定で部分一致です。pattern: "^[A-Z]+$" は文字列全体に固定されますが、pattern: "[A-Z]+" は文字列内のどこかに大文字があれば一致します。
pattern: "[A-Z]+" accepts: "helloX" (because X matches)
pattern: "^[A-Z]+$" accepts only: "HELLO"
anyOf を意図して oneOf を書いてしまう
oneOf はちょうど 1 つのブランチが一致することを要求します。2 つのブランチが同じ形を受け入れると、anyOf なら通るデータで oneOf は失敗し、メッセージも紛らわしくなります("matches more than one")。
oneOf: [ { type: "string" }, { type: "string", maxLength: 10 } ] on: "hi" → error: matches both anyOf: [ { type: "string" }, { type: "string", maxLength: 10 } ] on: "hi" → valid 主なユースケース
- API リクエストの検証
- デプロイ前にリクエストボディとエンドポイントの schema を貼り付けて確認しましょう。テストでカバーしきれない 400 レスポンス(必須フィールド欠落、型違反、範囲外の数値)を事前に捕まえられます。
- Webhook Payload の検証
- ベンダーが送ってきた payload をハンドラーが拒否しますか?実 payload を自分の schema、次にベンダー公開 schema で検証してください。両者の差分がバグの正体です。
- 設定ファイルの Lint
- package.json、tsconfig.json、helm values.yaml — どの設定ファイルにも公開 schema があります。Schema と設定を貼り付ければ、タイプミスを試行錯誤なしに発見できます。
- OpenAPI コンポーネントのテスト
- OpenAPI 3.1 ドキュメントから schema コンポーネントを取り出して貼り付け、サンプル payload を検証します。Mock サーバーを立てるより速く、決定的で、SDK も不要です。
- フォーム送信のプリフライト
- フロントエンド検証の実装前にサンプルフォーム payload を貼り付け、想定どおりに拒否し受け入れることを確認したうえで、同じ schema をクライアントとサーバーに展開しましょう。
- データパイプライン契約チェック
- ETL 出力がドリフトしましたか?サンプル行と下流 schema を貼り付ければ、どの producer が変わり、どのキーが壊れたかを特定できます。10,000 行のリトライを発動させる前に。
技術詳細
- Draft 2020-12 準拠
- 公開された Draft 2020-12 仕様(keyword、型システム、format 語彙)を実装。Ajv 8.x と ajv-formats の出力でクロスチェック済みです。
- JSON Pointer エラーパス
- エラーは RFC 6901 JSON Pointer(/user/email/0)を使用。各 keyword 失敗はデータ内の解決可能な単一位置を指し、曖昧さや文字列検索は不要です。
- 内部 $ref の解決
- 単一ドキュメント内の $ref ポインター(#/$defs/foo、#/properties/bar)を解決します。循環参照は検出して報告。外部 HTTP $ref はプライバシー保護のため無効化されています。
ベストプラクティス
- additionalProperties: false を必ず設定
- 入力契約(リクエストボディ、設定ファイル、キューメッセージ)では、未知のキーは大抵バグです(タイプミス、誤って混入したフィールド、攻撃者の探り)。既定で拒否しましょう。
- 再利用するサブ schema は $defs に
- 同じ形を 2 度インラインで書けば、いずれずれていきます。共有定義を $defs に移し、$ref で参照しましょう。単一の真実の源があれば、変更は一度で全所に反映されます。
- 業務ロジックの前に検証する
- JSON.parse 直後、解析済み構造に触れる前に schema 検証を実行してください。型ナローイング、デフォルト値補完、永続化はいずれも契約成立を前提とします。まず成立を保証しましょう。
よくある質問
JSON Schema 検証とは何ですか?
このバリデーターはどの JSON Schema Draft をサポートしますか?
Schema を使って JSON を検証するにはどうすればいいですか?
JSON Schema 検証と JSON 構文検証の違いは何ですか?
正しく見える JSON が schema に拒否されるのはなぜ?
$ref とリモート schema 参照に対応していますか?
additionalProperties: false は何をしますか?
Node.js や Python で schema を使って JSON を検証するには?
oneOf、anyOf、allOf の違いは何ですか?
OpenAPI スキーマに対応していますか?
バリデーターが「JSON Schema 自体が無効」と言うのはなぜ?
ツールは私の JSON や schema をサーバーに送信しますか?
JSON Lines(NDJSON)や複数ドキュメントを検証できますか?
関連ツール
すべてのツールを見る →Base64エンコーダー&デコーダー
エンコーディングとフォーマット
Base64のデコード・エンコードが無料でオンラインで行えます。リアルタイム変換、UTF-8・絵文字対応。100%ブラウザ上で動作しデータは外部に送信されません。登録不要。
JSON Diff(差分)
エンコーディングとフォーマット
2つのJSONファイルをブラウザで即座に比較・差分確認。サイドバイサイドのハイライト表示、RFC 6902 JSON Patch出力、タイムスタンプやIDなどのノイズフィールドを無視。100%プライベート、アップロード不要。
JSONフォーマッター&バリデーター
エンコーディングとフォーマット
無料オンラインJSON整形ツール。ブラウザ上でJSONのフォーマット、構文検証、圧縮を即座に実行。エラー検出、ワンクリックコピー対応。データは端末外に送信されず、100%プライバシー保護。
JSON to YAML コンバーター
エンコーディングとフォーマット
JSONを貼り付けるだけで即座にYAMLを取得。ブラウザ内でリアルタイム変換。K8s・Compose対応、2/4スペースインデント、Norway問題対応自動クォート。100%プライベート、データは送信されません。
QRコード生成 — URL / WiFi / vCard / Email / SMS / 位置
エンコーディングとフォーマット
無料のQRコードジェネレーター。URL・WiFi・vCard・メール・SMS・位置情報など7種類に対応した静的QRを生成。期限切れなし、登録不要、100%ブラウザで完結し、アップロード一切なし。SVGとPNGで保存できます。
URLエンコーダー&デコーダー — URL構造パーサー内蔵
エンコーディングとフォーマット
URLを貼り付けるだけで即座にエンコード・デコード。内蔵URLパーサーがプロトコル・ホスト・パス・クエリパラメータを編集可能なフィールドに分解。encodeURIとencodeURIComponentの2モード対応。完全ブラウザ動作でデータ送信なし。