JSON から TypeScript・Go・Python・PHP・Rust
プライバシー優先設計 — すべてブラウザ内で処理します
実際の API レスポンスから正しい型定義を推論する作業は、本来なら 5 秒で済むはずなのに 15 分かかってしまうことがあります。このツールは JSON サンプルをブラウザ内で読み取り、構造をたどって、TypeScript・Go・Python・PHP・Rust の慣用的な型を生成します ― 任意フィールド、ISO 日付の判別、整数 vs 浮動小数点の区別を含みます。
推論の仕組み
ツールは JSON ツリーを 1 度走査し中間表現を構築します。プリミティブは string / int / float / bool / null になり、配列は要素のユニオンから型を推定し、オブジェクトはフィールド型が値に由来する構造体になります。配列のある要素に存在し別の要素には存在しないフィールドは任意としてマークされ、不完全データでも壊れずデコードできます。小数部のない数値は int64 (Go) / int (Python) / i64 (Rust)、ある数値は float64 / float / f64 になります。ISO 8601 形式の文字列(`2024-03-15T10:30:00Z`)は Date / time.Time / datetime / DateTimeInterface / chrono::DateTime に変換されます。
言語ごとの出力スタイル
各エミッタは対象言語の慣習に従います。TypeScript: エクスポート interface + `?:`。Go: `json:` タグ付き struct、任意はポインタ + `omitempty`。Python: `@dataclass`、必須が先で `Optional[T] = None` が最後(dataclass の並び順規則)。PHP: 厳格な型付き final class と配列に `@var list<T>` の phpdoc。Rust: `#[derive(Serialize, Deserialize)]` struct、null 可フィールドに `Option<T>`、Rust の snake_case 名と JSON キーが異なる場合は `#[serde(rename)]`。
使うべき時(と使わない時)
このジェネレータは最初の 80% を解決します ― ペイロードから動く型定義を秒で得るタスク。string の regex 制約、数値の min/max、判別共用体など、精密な制約が必要な場合は手書きスキーマの代わりにはなりません。そういう場合は出力を出発点として型を厳しくしてください。任意フィールドの検出はヒューリスティックで、サンプルに含まれる情報に基づくため、できれば複数の多様なサンプルを通してください。
よくある質問
- 貼り付けた JSON はブラウザから出ますか?
- いいえ。パーサー、型推論、コード出力はすべてタブ内の JavaScript で実行されます。生成中にネットワークパネルを開くと外部送信は 0 件です。本番ペイロード(実トークン・個人情報)にも安全です。
- 常に値がある項目がなぜ任意とマークされるのですか?
- 任意フラグは、配列の一部要素にそのフィールドがあり別の要素にはない場合に立ちます。単一オブジェクトを貼り付けても、同一構造のオブジェクト配列を貼り付けても、何も任意にはなりません。配列内で構造が異なる場合にのみ任意になります。
- 整数と浮動小数点はどう区別されますか?
- JSON には数値型が 1 つしかありません。各値を検査し、小数部がなければ int(`42`、`1000`)、あれば float(`3.14`、`99.0`)を出力します。配列が両方を含む場合は損失あるデコードを避けるため float に拡張されます。
- ISO 日付文字列を検出しますか?
- はい。`YYYY-MM-DD` または `YYYY-MM-DDTHH:MM:SS[.sss][Z|±HH:MM]` に一致する文字列は、言語のネイティブな日付/日時型(TS の Date、Go の time.Time、Python の datetime、PHP の DateTimeInterface、Rust の chrono::DateTime)として出力されます。他の形式は string のままです。
- 生成されたコードを使うのに何かインストールが必要ですか?
- TypeScript はピュアで依存なし。Go は標準ライブラリのみ(ISO 日付があれば time.Time)。Python は標準 dataclasses。PHP はネイティブ型。Rust は ISO 日付がある場合 serde + chrono が必要。ヘッダー/インポートは該当時に出力内に含まれます。
- ルートが配列の場合も型生成できますか?
- はい。ルート値がオブジェクト配列の場合、要素の構造体とそれを参照するトップレベル型エイリアスを出力します。例:`[{...}, {...}]` を `Users` と命名すると、TypeScript では `User` インタフェース + `type Users = User[];`、Rust では `pub type Users = Vec<User>;` になります。