JSONスキーマジェネレーター

JSONを貼り付けて、自動的にJSON Schemaを生成します。

データはデバイスを離れません

使い方

  1. JSONオブジェクトまたは配列を入力エリアに貼り付けます。
  2. オプションを有効化: 「required」配列または値からの「examples」を含めます。
  3. スキーマを生成をクリックして、JSON Schema(Draft 2020-12)を作成します。
  4. 生成されたスキーマをコピーまたはダウンロードします。

よくある質問

どのバージョンのJSON Schemaが生成されますか?

ジェネレーターは、最新の安定したドラフトであるJSON Schema Draft 2020-12(https://json-schema.org/draft/2020-12/schema)を生成します。

ネストされたオブジェクトと配列を処理しますか?

はい。ジェネレーターはネストされたオブジェクトと配列を再帰的に処理します。配列の場合、最初の要素からスキーマを推論します。

生成されたスキーマを編集できますか?

出力は出発点です。minLengthminimumpatternenumなどの制約を必要に応じて追加することができます。

JSON Schemaは何のためにあるか

JSON Schemaは、JSON文書がどのような形であるべきかを宣言的に記述する方法です。どのプロパティを持ち、それらのプロパティがどの型を保持し、何が必須で何が任意で、どの値が有効かを示します。XMLにとってのXSDや、データベースのテーブル定義に相当するJSON世界のものです。公式プロジェクトはjson-schema.orgにあります。

実世界で出会う場面:

実際に目にするドラフト

JSON Schemaの仕様は一連のドラフトとして公開されてきました。現在の安定版ドラフトは2020-12です(公式仕様ページより: "The current version is 2020-12")。出会う可能性のあるドラフト:

迷ったら、あなたのバリデータに合うドラフトを選んでください。AJV(最も人気のあるJavaScriptバリデータ)は明示的なオプトインにより Draft 04、06、07、2019-09、2020-12 をサポートします。Pythonのjsonschemaも同様です。下流の消費者が何を望むか分からないなら、2020-12は新しい作業に対して安全な既定です。

組み込みの型

JSON SchemaはJSONの値の種類に対応する七つの基本型を記述します。

JSON値よく使うキーワード
string"hello"minLengthmaxLengthpatternformat
number42, 3.14minimummaximumexclusiveMinimummultipleOf
integer42numberの部分集合; 小数部なし。
booleantrue / false追加の制約なし。
nullnull別個の型; nullが有効な場合に明示的にする。
array[…]itemsminItemsmaxItemsuniqueItems
object{…}propertiesrequiredadditionalProperties

構成キーワードを使えば組み合わせ自由です: oneOf(ちょうど一つ)、anyOf(少なくとも一つ)、allOf(全部)、not(逆)。さらに、許可される値の有限リスト用のenum、固定値一つ用のconst

自動生成スキーマが教えてくれること、教えてくれないこと

単一のJSON例からスキーマを推定するのは強力ですが限界があります。ジェネレータが検出できるもの:

検出できないもの:

出力は70%完成のスタート地点として扱ってください。価値のある追加(どのフィールドが本当に必須か、どの文字列フォーマットが当てはまるか、どの値の範囲が許されるか、各フィールドの意味)は人の手によるキュレーションの段階です。

知っておく価値のある二つの微妙な落とし穴

JSON Schema 対 Zod / Joi / Yup 対 TypeScript型

JSON Schemaの役割と重なる技術はいくつかあり、それぞれに得意分野があります。

スキーマを複数の言語またはツール(IDE、OpenAPI ツーリング、コードジェネレータ)が消費する必要があるなら、JSON Schemaが正しい居場所です。単一の言語の中に留まるのであれば、その言語ネイティブの選択肢の方が書き心地が良いことが多いです。

よくあるユースケース

よくある間違い

  1. 自動生成されたスキーマを最終仕様として扱う。 あくまでスタート地点です。フォーマットのヒントを追加し、本当に任意のフィールドに印を付け、ドキュメントを追加し、値の範囲を設定してください。
  2. $schema宣言を忘れる。 バリデータはどのドラフトを適用するか知るためにこれを使います。常にスキーマの最上部に含めてください。
  3. requiredをプロパティごとの属性として扱う。 XSDやMongooseのスキーマと異なり、JSON Schemaのrequiredは必須プロパティの名前を列挙した、親オブジェクトレベルの配列です。
  4. 厳格な検証が欲しいときにadditionalProperties: falseを忘れる。 既定値はtrueで、未知のキーが黙って許されることになります。
  5. enumexamplesを混同する。 enum=許可される値のリスト(検証)。examples=ドキュメント目的のサンプル値(検証への影響なし)。
  6. formatが強制されると仮定する。 Draft 2020-12では既定で注釈であり、アサーションではありません。あなたのメール用正規表現はオプトインしない限り実行されません。
  7. 単一の例から任意性を推定する。 例にあるすべてのキーは既定で必須になります。実際の仕様にはほとんど常に任意フィールドがあります。キュレーションの一部としてrequired配列から外してください。

その他のよくある質問

スキーマはOpenAPI 3.1で動きますか?

はい。OpenAPI 3.1(2021年2月リリース)はスキーマ言語をJSON Schema Draft 2020-12と完全に整合させました。これがこのジェネレータが出力するものです。スキーマをOpenAPI ドキュメントのcomponents.schemasに入れ、$refで参照してください。古い OpenAPI 3.0はそれ以前のサブセットを使っていました。3.0をターゲットにするなら調整が必要かもしれません。

このスキーマから自分の言語の型を生成できますか?

はい。quicktypeはJSON SchemaからTypeScript、Go、Python、Java、C#、Swift、Kotlin、Rust、Elmなどを生成します。json-schema-to-typescriptはJS専用の代替です。最も現代的な言語にはスキーマから型へのツールが少なくとも一つあります。生成されたスキーマはそのすべての入力として機能します。

$defsdefinitionsの違いは何ですか?

どちらもドキュメント内の他の場所から$refできる再利用可能なサブスキーマを置く場所です。definitionsは古い名前で、Draft 04、06、07で使われました。$defsは現在の名前で、Draft 2019-09で導入され2020-12でも継続しています。機能的には等価ですが、新しい作業には$defsを使ってください。

私のJSONはどこかへ送られますか?

いいえ。スキーマ生成は完全にブラウザ内で動きます。貼り付けられたJSONはローカルで解析され、走査され、出力テキストエリアにスキーマとして出力されます。サーバにアップロードされず、記録されず、タブを閉じた後に保持されません。JSONの例には顧客記録、内部APIのレスポンス、従業員情報のような、第三者を通したくない実データが含まれることが多いため、これは重要です。

なぜ私の配列のスキーマは最初の要素だけを記述したのですか?

単一の例からの推定は配列を同質として扱います。最初の要素を見て、残りも同じだと仮定します。実際の配列が異なる形を持ちうるなら、items{ "oneOf": [...] }として手書きする必要があります。あるいは各バリアントに対して別々にジェネレータを実行し、スキーマを組み合わせてください。

そもそもジェネレータを使うべきか、それともスキーマを手書きすべきか?

あなたが端から端まで管理する小さなスキーマなら、手書きの方が仕様を早く覚えられます。何十ものネストされたオブジェクトを持つ大きなAPIレスポンスでは、生成すれば数秒でドラフトに到達でき、節約した時間を制約、説明、required配列のキュレーションに使えます。働く多くの開発者は両方を行います: 生成して、それからキュレートする。

関連ツール

無料の JSON フォーマッタ&バリデータ・オンライン JSON比較ツール JSON→YAML変換