JSON サンプルから JSON Schema を生成 — Draft 2020-12 / Draft-07
API レスポンスや設定ファイルの JSON サンプルを貼り付けると、対応する **JSON Schema (Draft 2020-12 / Draft-07 切替可)** を自動生成します。値から型を推論 (`string` / `number` / `integer` / `boolean` / `array` / `object` / `null`)、配列要素は merge して `items` を 1 つにまとめ、必須キーは `required` に列挙。`additionalProperties: false` の strict モード、null 許容を `[T, "null"]` で表現する nullable モード、文字列の `format` 自動検出 (`email` / `uri` / `uuid` / `date` / `date-time` / `time` / `ipv4` / `ipv6`) のオプション付き。OpenAPI 3.1 / AJV / VS Code 設定 JSON Schema・package.json schema / GitHub Actions workflow schema の **雛形作成** に最適。`json-to-ts` (同じ JSON から TypeScript 型を生成) の姉妹ツールで、本ツールは **API ドキュメント / バリデーション** 用途、json-to-ts は **コード上の型定義** 用途に棲み分け。すべてブラウザ内で処理、サーバー送信なし。
使い方
JSON サンプルを貼り付け、サンプルボタンで「ユーザー」「API レスポンス」「配列要素」「null 許容」例も試せます。 Draft (2020-12 / 07) と strict / nullable / format 検出 / integer 区別を切替。 対応する JSON Schema が即座に生成されます。コピーまたは `.json` でダウンロード可能。 結果は OpenAPI 3.1 (Draft 2020-12 ベース) や AJV (Draft-07 / 2019-09 / 2020-12 対応) の input にそのまま使えます。
詳細解説
スキーマ推論が露わにするデータ設計
JSON Schema を自動生成するには、サンプル JSON を入力として与える必要があります。このサンプルには実際の API レスポンス・データベースエクスポート・フォーム入力のサンプルデータが使われることが多く、顧客のメールアドレス・ユーザー ID・権限ロール・トランザクション金額などが含まれていることがあります。
さらに、生成された JSON Schema 自体も機密情報です。additionalProperties: false のスキーマや format: "email" の付いたフィールド名は、アプリケーションのデータモデルを詳細に示します。データベーススキーマと同等の情報量を持つ JSON Schema が外部に渡ることは、システム設計書の一部を公開することと同義です。
スキーマ生成サービスにサンプルデータを送るリスク
「JSON schema generator」で検索して出るオンラインツールは、入力 JSON をサーバーで処理してスキーマを返します。サンプルデータに実際のユーザー情報が含まれていれば、それがサーバーに届きます。また、生成されたスキーマのフィールド構造から、アプリケーションのデータモデル全体が推定可能です。
開発チームが「スキーマのたたき台を作るため」に本番データのサンプルを使う場面は多いです。実際のデータを使った方がフィールドのカバレッジが正確なためですが、その判断がオンラインツールを使っている場合はデータ漏洩のリスクを生みます。
JSON.parse と局所的な型推論でブラウザ内完結
このツールは JSON.parse でサンプルをパースし、オブジェクトツリーを再帰的に走査して各フィールドの型を推論します。JSON Schema Draft 2020-12 と Draft-07 の両方の $schema 形式で出力します。format 検出 (email / uri / uuid / date / date-time / ipv4 / ipv6) は正規表現による局所的な照合で行われ、外部 API は一切呼び出しません。
入力したサンプル JSON・出力された JSON Schema のいずれもページメモリ内にのみ存在します。本番データのサンプルを貼り付けてスキーマを生成し、スキーマだけをコピーする、という作業がネットワーク送信なしに完結します。
OpenAPI 定義や AJV バリデーション設定として使う
生成されたスキーマは OpenAPI 3.1 の components/schemas にそのまま貼り付けられる形式 (Draft 2020-12) と、AJV での ajv.compile() にそのまま渡せる形式 (Draft-07) の両方を選べます。strict: true で additionalProperties: false を付けることで、未知フィールドを拒否する厳格なバリデーターを生成できます。型定義との比較が必要な場合は json-to-ts と組み合わせて、同じサンプルから TypeScript 型と JSON Schema の両方を得ることができます。サンプルを揃えてから流し込みたい場合は json-format で整形すると差分が読みやすくなります。
サンプル 1 件からの型推論アルゴリズムの限界
JSON Schema の自動生成は本質的に「目に見える 1 件のサンプルから一般化された型を推測する」操作で、推論の自由度には限界があります。本ツールは値のリテラル型から string / number / integer / boolean / array / object / null を判定し、配列の場合は要素ごとに型を求めて union として merge (例: [1, "x"] → { "type": ["integer", "string"] }) します。integer と number の区別は Number.isInteger() で行い、1.0 のような JSON リテラルがパース後に整数化されるため、サンプルが整数だけだと future の小数値を許容しないスキーマが出てしまうことがあります。
format 検出は値の文字列を正規表現で照合する局所判定です。RFC 5322 完全準拠の email バリデーションは実装が膨大になるため、format 注釈は「ヒント」として埋めるだけで実際の検証は AJV や ajv-formats に任せる設計が一般的です。enum の自動推論は現状行わず、status: "active" のような限定値もただの string として扱います (1 サンプルから「これは enum である」と判定するのは過剰推論のため)。実運用では生成後に手動で enum / minLength / pattern を追記することを想定しています。
Draft 2020-12 / Draft-07 / OpenAPI 3.0 の方言の違い
JSON Schema は IETF Draft で進化しており、本ツールが対応する Draft 2020-12 と Draft-07 では items 配列の意味が違います。Draft-07 では items: [A, B] が「タプル: 1 番目は A、2 番目は B」を意味しましたが、Draft 2020-12 ではタプル指定は prefixItems に分離され、items は「(prefixItems を超えた) 追加要素全体の型」になりました。$id / $ref の解決規則も 2020-12 で $dynamicRef が追加されるなど更新されており、古いツールチェーンとの互換性に注意が必要です。
OpenAPI 3.0 は JSON Schema Draft 04/05 ベースで nullable: true という独自フィールドを使い、exclusiveMinimum が boolean (Draft-04) だった世代に依拠しています。OpenAPI 3.1 で「JSON Schema 2020-12 完全準拠」が達成され、type: ["string", "null"] の素朴な nullable 表現が初めて公式にサポートされました。本ツールの nullable モードは 2020-12 寄りに作ってあるので、OpenAPI 3.0 に貼り付ける際は nullable: true への置換が必要です。AJV に渡すときは draft07 の方が広いバージョンの AJV (v6, v7, v8) で動作することも実務上のポイントです。
よくある質問
- json-to-ts との違いは?
- json-to-ts は **TypeScript の interface / type 定義** を生成 (ソースコード上の型)。本ツールは **JSON Schema** を生成 (API バリデーション / OpenAPI / 設定ファイル schema 用)。同じ JSON サンプルから違うアウトプットを得る姉妹ツール。
- Draft 2020-12 と Draft-07 の違いは?
- Draft 2020-12 (2020 年版) は最新の JSON Schema 仕様で、OpenAPI 3.1 が採用。Draft-07 (2017 年版) は AJV 等の **広く使われている既定**。違いは `$id` / `$schema` / `items` の扱い (Draft 2020-12 では `prefixItems` 導入) など。本ツールは両方の `$schema` を出力します。
- strict (additionalProperties: false) はいつ使う?
- API バリデーションで「未知のフィールドは拒否したい」場合や、設定ファイルで typo をエラーにしたい場合。OpenAPI / GraphQL の strict-mode に。逆に extensible にしたい場合は OFF (`additionalProperties` を出さない)。
- nullable オプションの動作は?
- サンプル内で `null` が登場すると、その field の `type` を `["string", "null"]` のように union に。ON では JSON Schema 標準の表現、OFF だと `null` 値を **無視** して non-null 型として推論します。OpenAPI 3.1 は Draft 2020-12 nullable 表記に対応、Draft-07 + nullable は AJV で動きます。
- format 検出はどんな string にマッチする?
- (1) `email`: RFC 5322 簡易判定、(2) `uri`: `http(s)://` 始まり、(3) `uuid`: 8-4-4-4-12 hex、(4) `date`: `YYYY-MM-DD`、(5) `date-time`: ISO 8601、(6) `time`: `HH:MM:SS`、(7) `ipv4`: 4 オクテット、(8) `ipv6`: 簡易判定。誤検出を防ぐため strict な regex を使用。
- integer と number は区別される?
- ON の場合、小数点を持たない数値 (例: `42`) は `"type": "integer"`、小数点を持つ数値 (例: `3.14`) は `"type": "number"`。OFF だと両方 `number`。OpenAPI は両方を区別、JSON Schema 標準 (Draft 7+) も区別します。
- 配列要素の型が混在 (例: `[1, "a"]`) したら?
- `items` に `oneOf` (Draft 2020-12) または `type: ["integer", "string"]` (union) を出します。typeof で分割できる場合は union、object 同士で構造が違う場合は oneOf。
- データはサーバーに送信されますか?
- いいえ。`JSON.parse` + ローカル推論のみ。
「送らない」を確かめるには
このツールは入力データを外部に送信しません。仕組み・監査手順・運営方針は以下で詳しく説明しています。
類似のツール
JSON → TypeScript 型定義生成
JSON を貼り付けると、対応する TypeScript の interface / type 定義を生成します。ネストしたオブジェクトは別 interface に分割、配列はキーをマージして一部だけに存在するキーを optional (?) に、混在する値は union 型に変換。ルート型名・interface / type 切替・export 付与を選べます。同じ構造の型は 1 つにまとめます。JSON はブラウザ内でだけ処理され、外部に送信されません。
JSON 整形・検証 — インデント / 圧縮 / エラー表示
JSON をブラウザ内で整形 (インデント指定) ・最小化・バリデーションします。エラー行・列を表示。データは一切外部に送信されません。
JSON 比較 / 差分 — 構造的に違いを抽出
2 つの JSON を構造的に比較。オブジェクト/配列のネストを再帰的に解析し、追加・削除・変更・移動の各差分をハイライト表示します。すべてブラウザ内で処理。
JSON Path クエリ — JSONPath で JSON ツリーを探索
JSON データに対して JSONPath クエリ (例: `$.store.book[*].author`) を実行して、必要な値だけを取り出します。jsonpath-plus (MIT) でブラウザ内処理、結果は値・パス・親ノードのいずれかで取得可能。API レスポンスの抽出、ログから特定フィールドだけ抜き出す、設定ファイルの値確認、DevTools での JSON 探索に便利。複雑な式 (`?(@.price < 10)` / `$..` / `[?(@.tag=='x')]`) も使えます。データはブラウザ内でのみ評価され、外部送信はありません。