Oh MyUtils

JSON Schema ジェネレーター - JSONデータからスキーマ生成 オンライン

APIバリデーション、ドキュメント作成、コード生成のためにJSONデータからJSON Schemaを生成します。Draft-04、Draft-07、2020-12対応 — 100%クライアントサイド処理、サーバーへのデータ送信なし。

Schemaドラフト
必須フィールド
フォーマット検出
追加プロパティ
インデント
JSON入力
JSON Schema出力
 

よくある質問

JSON Schema Generatorとは何ですか?

JSON Schema Generatorは、サンプルJSONデータからJSON Schema定義を自動的に作成するツールです。JSON Schemaは、JSONドキュメントの構造、型、制約を記述する標準的なボキャブラリー(json-schema.orgで定義)です。スキーマ定義を手動で書く代わりに、JSONの例を貼り付けるだけで、オブジェクトプロパティ、データ型、必須フィールド、配列アイテムの型、日付やメールアドレスなどの文字列フォーマットを含む正しいスキーマを推論します。

JSONデータからJSON Schemaを生成するにはどうすればよいですか?

左側の入力フィールドにJSONデータを貼り付けてください。ツールが右側の出力パネルにJSON Schemaを即座に生成します。スキーマドラフトバージョン(Draft-04、Draft-07、2020-12)の選択、必須フィールド検出のトグル、日付やメールアドレスなどのパターンの文字列フォーマット検出の有効化、追加プロパティの許可制御で出力をカスタマイズできます。

このツールを使用する際、JSONデータは安全ですか?

はい、完全に安全です。このツールはクライアントサイドJavaScriptを使用してブラウザ内ですべてを処理します。JSONデータがコンピュータから出ることは一切ありません — サーバーアップロード、API呼び出し、データ保存はありません。

どのJSON Schemaドラフトバージョンを使用すべきですか?

エコシステムに基づいて選択してください:Draft 2020-12(デフォルト)は最新の安定標準でOpenAPI 3.1で使用されています。Draft-07はバリデーションライブラリとツールで広くサポートされており、最大の互換性のための安全な選択です。Draft-04はレガシーシステムとOpenAPI 3.0互換性に必要です。

ツールはどのように必須フィールドを決定しますか?

デフォルトでは、ツールは生成されたスキーマで非nullプロパティをすべて必須としてマークします。null値を持つフィールドは、そのフィールドが存在しないかオプションである可能性を示すため、requiredアレイから除外されます。この動作を完全にオフにすることもできます。

ツールはどのような文字列フォーマットを検出しますか?

フォーマット検出が有効な場合、ツールは文字列値を分析し、認識されたパターンに対して自動的に「format」キーワードを追加します:date-time(ISO 8601タイムスタンプ)、date、time、メールアドレス、URI/URL、UUID、IPv4アドレス、IPv6アドレス。

「追加プロパティ」オプションは何をしますか?

JSON Schemaの「additionalProperties」キーワードは、オブジェクトがスキーマに記載されていないプロパティを含むことができるかどうかを制御します。「許可」(デフォルト)に設定すると、追加フィールドが許可されます。「拒否」に設定すると、予期しないフィールドを拒否する厳格な契約を作成します。

コード例

// JSON to JSON Schema generator
function jsonToSchema(json, options = {}) {
  const { draft = '2020-12', includeRequired = true, detectFormats = true } = options;
  const schemaUri = {
    'draft-04': 'http://json-schema.org/draft-04/schema#',
    'draft-07': 'http://json-schema.org/draft-07/schema#',
    '2020-12': 'https://json-schema.org/draft/2020-12/schema',
  }[draft];

  function inferSchema(value) {
    if (value === null) return { type: 'null' };
    if (typeof value === 'boolean') return { type: 'boolean' };
    if (typeof value === 'number') {
      return { type: Number.isInteger(value) ? 'integer' : 'number' };
    }
    if (typeof value === 'string') {
      const schema = { type: 'string' };
      if (detectFormats) {
        if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}/.test(value)) schema.format = 'date-time';
        else if (/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)) schema.format = 'email';
        else if (/^https?:\/\//.test(value)) schema.format = 'uri';
      }
      return schema;
    }
    if (Array.isArray(value)) {
      if (value.length === 0) return { type: 'array', items: {} };
      const itemSchemas = value.map(inferSchema);
      const unique = dedup(itemSchemas);
      return { type: 'array', items: unique.length === 1 ? unique[0] : { oneOf: unique } };
    }
    if (typeof value === 'object') {
      const properties = {};
      const required = [];
      for (const [key, val] of Object.entries(value)) {
        properties[key] = inferSchema(val);
        if (includeRequired && val !== null) required.push(key);
      }
      const schema = { type: 'object', properties };
      if (required.length > 0) schema.required = required;
      return schema;
    }
    return {};
  }

  function dedup(schemas) {
    const seen = new Map();
    for (const s of schemas) {
      const key = JSON.stringify(s);
      if (!seen.has(key)) seen.set(key, s);
    }
    return [...seen.values()];
  }

  const parsed = JSON.parse(json);
  return { $schema: schemaUri, ...inferSchema(parsed) };
}

// Usage
const json = '{"name":"Alice","age":30,"email":"alice@example.com"}';
console.log(JSON.stringify(jsonToSchema(json), null, 2));

関連ツール