本文へスキップ

JSONからJSON Schema

JSON to JSON Schema

1つまたは複数の実例からJSON Schemaを推論し、見つかった形を合わせて1つにします。

例の文書をJSON Schema(2020-12)として記述します。型、properties、`required`、そして繰り返し現れる形のための入れ子の`$defs`が出ます。契約テストやOpenAPIのコンポーネントなど、例ではなくスキーマを求められる場所で使えます。

🔒 ブラウザの中だけで動きますjson-schemajsoncodegenvalidation
出力する形式

サンプルJSON

.json ファイルを置く

このタブの中で読みます。アップロードはしません。

手元にある要素を全部入れてください。レコードが一つ増えるたびに推論が絞り込まれます。どれか一つに無いフィールドこそが、省略可能である根拠です。

TypeScript

使い方

  1. 手元にあるレコードをできるだけ多く貼り付けます

    配列は先頭の要素だけでなく、すべての要素を読んで合わせます。レコードが3件あれば1件のときよりはるかに多くのことが分かります。どれか1件に欠けているという事実こそが、そのフィールドを省略可能にする根拠だからです。

  2. ルートの型に名前を付けます

    入れ子のオブジェクトは、それを保持しているキーの名前を取ります。配列なら単数形になるので、`users`からは`User`ができます。自分で名前を決める必要があるのはルートだけです。

  3. 出力の下にある件数を読みます

    型の数、省略可能なフィールドの数、ユニオンの数、そして合わせたレコードの数が出ます。ユニオンが0より大きければ、あるフィールドが標本の中で違う種類の値を持っていたということなので、結果をコードベースに貼り付ける前に一度見ておく価値があります。

  4. スキーマを検証ツールに持っていきます

    出力には`$schema`キーワードが入っているので、このサイトのJSON Schema検証ツールにも、ほかの2020-12実装にもそのまま入れられます。

よくある質問

どのdraftですか

`$schema`キーワードに書いてあるとおり2020-12です。使い回す形は`$defs`に入れて`$ref`で参照しますが、これはそのdraftの書き方です。Draft-07向けのツールは`definitions`を期待するので、この参照を解決できません。

型以外の制約が付かないのはなぜですか

`format`、`minLength`、`pattern`、`enum`は出しません。どれも数件のレコードから推測することになりますし、本番の正しいデータを拒否するスキーマは、単に緩いだけのスキーマよりも悪いものです。根拠を示せる制約だけを自分で足してください。

`additionalProperties`は設定されますか

開いたままにします。つまり追加のキーがあっても検証を通ります。閉じてしまうと、APIがあとから足すフィールドのたびに検証が失敗しますし、標本だけではその形が閉じたものかどうかは分かりません。

`required`はどう決まりますか

その形にまとめられたすべてのレコードに存在していたプロパティだけがrequiredになります。レコードを1件だけ入れれば全部がrequiredになり、5件入れたあたりからスキーマが意味のあることを言い始めます。

ここから渡せます

次の一手

このツールが出したものをそのまま受け取れる道具です。