コンテンツにスキップ

🧬 JSON → 型定義変換

JSON を貼り付けるだけで TypeScript / PHP / Python / Go / Rust の型定義を自動生成します。ネストしたオブジェクトや配列も対応。

完全無料 登録不要 ブラウザ完結 5 言語対応 ダークモード

💡 使い方のヒント

• ネストしたオブジェクトは自動的に別の型として抽出されます。

• 配列内の要素から型を推論します。空配列は any[] / []interface{} 等になります。

• null は string | null のような optional / nullable として扱われます。

• ルート型名は右上の入力欄で変更できます。

📖 つまずきやすいポイント

JSON を貼り付けると TypeScript / PHP / Python / Go / Rust / Kotlin / Swift の型定義を生成します。ネストしたオブジェクトは別の型として抽出され、配列の要素からも型を推論します。処理はブラウザ内で完結します。推論できるのは、渡したサンプルに現れた形だけです — API のレスポンス 1 件は「そのとき返ってきた形」であって、仕様ではありません。生成物は完成品ではなく、手で直すための出発点だと考えてください。

ケース 何が起きるか どうする
サンプル 1 件から作った型が本番で合わない 推論は「見たものが全部」という前提で動きます。したがってそのサンプルに現れなかったフィールドは型に存在せず、たまたま値が入っていたフィールドは必須として扱われます。実際の API は、検索結果が 0 件のとき、エラーのとき、権限が足りないとき、古いレコードのときに、それぞれ違う形を返します。とくに危険なのは enum 的なフィールドで、サンプルに "active" しか無ければ型は "active" というリテラル型になり、"archived" が来た瞬間に型が嘘になります 複数のレスポンスを通してください — 正常・空・エラー・境界値の 4 パターンを最低限にして、生成された型を突き合わせるとどのフィールドが本当に必須なのかが見えてきますOpenAPI 仕様があるなら、そちらから生成してくださいopenapi-typescriptoapi-codegen「返りうる形」を仕様として持っているので、サンプルからの推論とは信頼性が違いますそして、生成した型は必ず一度読んでください — 全フィールドが必須、enum がリテラル 1 個、という型が出ていたら、それは「サンプルが 1 件だった」というサインです
空配列や null からは型が決まらない "tags": [] という値からは、要素の型を知る方法がありません — 結果は any[][]interface{}List<Any> のような「何でも入る型」になり、型検査の恩恵が完全に消えます。null も同様に情報が足りません — "deleted_at": null が「いつも null」なのか「今回だけ null」なのかは、この 1 件からは判別できません。さらに根本的な問題として、JSON では「キーが存在しない」と「キーの値が null」を区別できますが、多くの言語の型システムではこの区別が曖昧になります — TypeScript の ?:| null は別物です。 空配列を含むレスポンスは、要素が入っている別のレスポンスも通してください — 1 件でも要素があれば型が決まります。それが手に入らない場合は、その配列の型だけを手で書いてください — 生成物を「そのまま使うもの」ではなく「9 割を自動化して残りを埋めるもの」と考えれば、この作業は苦になりません。null の扱いは API のドキュメントを見るしかありません — 「キーが無い」と「null」を区別している API なら、TypeScript では deleted_at?: string | null のように両方を書くのが正確です。迷ったら緩いほうに倒してください — 型が緩くて実行時にチェックするほうが、型が厳しくて実行時に落ちるより安全です。
数値の型が言語によって意味を変える JSON の数値は 1 種類しかありません — 整数と小数の区別も、精度の指定もありません。したがって生成側は言語ごとに何かを選ばざるを得ず、Go なら float64、Rust なら i64f64、TypeScript なら number になります。ここで危険なのは ID です大きな整数を float64number で受けると、2 の 53 乗を超えた時点で精度が落ち、値が静かに書き換わります90071992547409939007199254740992 になっても、エラーは出ません。日付らしい文字列も、当然ながら string のままです。 ID・金額・日時は、生成後に必ず手で型を直してください。ID は文字列として扱うのが最も安全です — 計算しない値を数値で持つ理由はありません (実際、Twitter や Discord の API は大きな ID を文字列で返します)。金額は浮動小数点にしないでください0.1 + 0.20.3 にならないのと同じ理由で、最小単位の整数 (円なら 1 円単位) か、言語の Decimal 型を使ってください。日時は string ではなく各言語の日時型に直すと、タイムゾーンの扱いを型が強制してくれます生成した型を 1 行ずつ読み、「この値で計算するか」を自問してください — 計算しないなら文字列で構いません。

生成した型を「信頼できる境界」だと思わないでください。とくに TypeScript の型はコンパイル時にしか存在せず、実行時には何も検証しませんawait res.json() as User と書けば、実際に返ってきたものが何であれ、コンパイラは User だと信じます。これは型システムの欠陥ではなく、境界での検証は別のレイヤーの仕事だという設計です。API のレスポンスやフォームの入力のように外から来るデータには、zodvalibot のようなランタイム検証を必ず入れてください — スキーマから型を導出できるので、二重管理にもなりません。Go の json.Unmarshal や Rust の serde は実際に検証するのでまだ安全ですが、既定では未知のフィールドを黙って捨てます — Go なら DisallowUnknownFields、Rust なら #[serde(deny_unknown_fields)] で、API の変更に気付けるようになります

📖 使い方

  1. 1
    JSON を入力または貼り付け
    左側の入力欄に JSON を貼り付けます。「サンプル」ボタンでサンプルデータを素早く確認できます。
  2. 2
    言語を選択
    TypeScript / PHP / Python / Go / Rust / Kotlin / Swift から出力言語を選び、必要に応じてルート型名を変更します。
  3. 3
    型定義をコピーして利用
    右側に自動生成された型定義が表示されます。「コピー」ボタンでクリップボードにコピーしてコードに貼り付けます。

❓ よくある質問

ネストしたオブジェクトはどう扱われますか?
ネストしたオブジェクトは自動的に別の型として抽出され、参照として使用されます。
null フィールドはどう型付けされますか?
null フィールドは string | null のように optional / nullable として扱われます。言語によって Optional・?・pointer 型に変換されます。
配列のルート JSON には対応していますか?
はい。ルートが配列の場合は自動的に { items: [...] } としてラップして型生成します。
🐛 このツールで問題が発生しましたか?

完全無料・登録不要。再現手順だけでも結構です。届いたご報告は運営者に直接届き、修正の参考にします。

※ 不具合再現のため、ブラウザ情報 (UA / 画面サイズ / 言語 / URL) を自動で送信します