🧬 JSON → 型定義変換
JSON を貼り付けるだけで TypeScript / PHP / Python / Go / Rust の型定義を自動生成します。ネストしたオブジェクトや配列も対応。
💡 使い方のヒント
• ネストしたオブジェクトは自動的に別の型として抽出されます。
• 配列内の要素から型を推論します。空配列は 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-typescript や oapi-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 なら i64 か f64、TypeScript なら number になります。ここで危険なのは ID です — 大きな整数を float64 や number で受けると、2 の 53 乗を超えた時点で精度が落ち、値が静かに書き換わります。9007199254740993 が 9007199254740992 になっても、エラーは出ません。日付らしい文字列も、当然ながら string のままです。 |
ID・金額・日時は、生成後に必ず手で型を直してください。ID は文字列として扱うのが最も安全です — 計算しない値を数値で持つ理由はありません (実際、Twitter や Discord の API は大きな ID を文字列で返します)。金額は浮動小数点にしないでください — 0.1 + 0.2 が 0.3 にならないのと同じ理由で、最小単位の整数 (円なら 1 円単位) か、言語の Decimal 型を使ってください。日時は string ではなく各言語の日時型に直すと、タイムゾーンの扱いを型が強制してくれます。生成した型を 1 行ずつ読み、「この値で計算するか」を自問してください — 計算しないなら文字列で構いません。 |
生成した型を「信頼できる境界」だと思わないでください。とくに TypeScript の型はコンパイル時にしか存在せず、実行時には何も検証しません — await res.json() as User と書けば、実際に返ってきたものが何であれ、コンパイラは User だと信じます。これは型システムの欠陥ではなく、境界での検証は別のレイヤーの仕事だという設計です。API のレスポンスやフォームの入力のように外から来るデータには、zod や valibot のようなランタイム検証を必ず入れてください — スキーマから型を導出できるので、二重管理にもなりません。Go の json.Unmarshal や Rust の serde は実際に検証するのでまだ安全ですが、既定では未知のフィールドを黙って捨てます — Go なら DisallowUnknownFields、Rust なら #[serde(deny_unknown_fields)] で、API の変更に気付けるようになります。
📖 使い方
-
1
JSON を入力または貼り付け左側の入力欄に JSON を貼り付けます。「サンプル」ボタンでサンプルデータを素早く確認できます。
-
2
言語を選択TypeScript / PHP / Python / Go / Rust / Kotlin / Swift から出力言語を選び、必要に応じてルート型名を変更します。
-
3
型定義をコピーして利用右側に自動生成された型定義が表示されます。「コピー」ボタンでクリップボードにコピーしてコードに貼り付けます。
❓ よくある質問
ネストしたオブジェクトはどう扱われますか?
null フィールドはどう型付けされますか?
配列のルート JSON には対応していますか?
🐛 このツールで問題が発生しましたか?
完全無料・登録不要。再現手順だけでも結構です。届いたご報告は運営者に直接届き、修正の参考にします。
ご報告ありがとうございます!
運営者に届きました。改善の参考にさせていただきます。