JSON → コード生成
JSONJSON から TypeScript・Java・Go・C# のエンティティ型を生成。ネストしたオブジェクトや配列を推論。
リモート URL の取得は行いません。JSON を直接貼り付けてください。
このページの内容
JSON → コード生成とは?#
JSON → コードジェネレーターは、サンプルの JSON ドキュメントを読み、データの形——どのフィールドが文字列で、どのフィールドが数値で、どのフィールドが入れ子のオブジェクトで、どのフィールドが何の配列か——を割り出し、そのデータを保持するために実際のプログラムが使うエンティティ型を書き出します。API レスポンスに合わせて TypeScript の interface、Java の class、Go の struct、C# の class を手書きする代わりに、例のレスポンスを 1 つ貼り付ければ、プロジェクトにすぐ落ちる型が得られます。
内部では、解析された値を歩いてスキーマを推論します。入れ子のオブジェクトは独自の名前付き型になり、配列の要素型はすべての要素の形のマージになります(そのため、同じキーをすべて持たないオブジェクトのリストでも、フィールドの和集合を持つ 1 つの型になります)。有効な識別子ではないフィールド名——first-name のようなハイフン入りキーや、数字で始まるもの——は正当な識別子にサニタイズされ、元のキーはシリアライズ注釈として保持されるため、往復変換は依然として機能します。
出力は、このページに依存しないプレーンテキストのソースコードです。コピーしてコードベースに貼り付け、型名を調整すれば出発点になります——完成したモデルではなく、退屈な骨組みを代わりに書いた、というだけです。
使い方#
- 言語ドロップダウンでターゲットを選びます: TypeScript、Java、Go、C#。
- ルート名(既定は
Root)を設定します。これが最も外側の型の名前になります——例えばUser、Order、Response。 - 左ペインに JSON を貼り付けます。生成されたコードは右にリアルタイムで現れ、ステータス行はエラー(無効な JSON、空の入力)を報告します。
- コピーをクリックしてコードをクリップボードに取り出します。
- サンプルはサブオブジェクトと配列を持つ入れ子のオブジェクトを読み込みます。クリアは両ペインをリセットします。
主な特徴#
- 4 つのターゲット言語。 TypeScript の interface、Java の class、Go の struct、C# の class——1 つの入力から 4 つの出力を、ドロップダウンで切り替えます。
- リテラルの型付けではなくスキーマ推論。 入れ子のオブジェクトは名前付き型になり、オブジェクトの配列は不透明な
anyのリストではなく、名前付きの要素型を生成します。 - まちまちの配列のマージ。 配列要素が異なるフィールドを持つ場合、推論された型はその和集合になります——すべてのアイテムがすべてのキーを持たないような、乱雑な現実のレスポンスに有用です。
- 識別子セーフかつキー忠実。 有効な識別子でないキーはサニタイズされ、元のキーはシリアライズ注釈(
@JsonProperty、Go のjson:タグ、JsonPropertyName)として保持されるため、元の JSON は正しくデシリアライズできます。 - リアルタイムかつローカル。 生成は入力やオプションの切り替えに合わせてブラウザ内で走ります。データがページから外に出ることはありません。
実例#
言語をTypeScript に、ルート名を Root に設定してサンプルを読み込むと、入力は次のとおりです:
{
"id": 1,
"name": "Ada",
"active": true,
"address": { "city": "London", "zip": "NW1" },
"tags": ["math", "logic"]
}
ジェネレーターは 2 つの interface を出力します——ルートと、入れ子のオブジェクトのための Address 型です:
export interface Root {
id: number;
name: string;
active: boolean;
address: Address;
tags: Array<string>;
}
export interface Address {
city: string;
zip: string;
}
言語をGo に切り替えると、同じ入力は元のキーを保持する json: タグ付き struct になります:
package model
type Root struct {
Id float64 `json:"id"`
Name string `json:"name"`
Active bool `json:"active"`
Address Address `json:"address"`
Tags []string `json:"tags"`
}
type Address struct {
City string `json:"city"`
Zip string `json:"zip"`
}
JSON の数値である id が、TypeScript では number、Go では float64 になる点に注意してください——JSON 自身がその両者を区別しないため、ジェネレーターは整数か浮動小数点かを推測しません。
よくある質問#
整数フィールドが float64 / Double / double になるのはなぜですか?#
JSON には単一の数値型しかなく、5 と 5.0 を区別する方法がないためです。ジェネレーターはすべての JSON 数値をターゲット言語の汎用数値型——TypeScript の number、Java の Double、Go の float64、C# の double——に対応させ、値が何であれ十分に保持できるようにします。あるフィールドが常に整数だと分かっている場合は、後で手動で int / Long / int64 に絞り込んでください。
配列のオブジェクトがすべて同じフィールドを持たないときはどうなりますか?#
それらの形はマージされます。[{ "a": 1 }, { "a": 2, "b": "x" }] のような配列は、a と b の両方を持つ 1 つの要素型を生成し、単一の型がすべてのアイテムをカバーします。2 つの要素がフィールドの型について互換性のない形で不一致の場合(ここでは数値、あちらでは文字列など)、そのフィールドは片方を選んで他方を間違えるのではなく、any / Object に低下します。
first-name のようにフィールドにハイフンがあります。壊れますか?#
いいえ。ジェネレーターは first-name を正当な識別子(firstName)に変え、元のキーを記録したシリアライズ注釈を出力します——Java では @JsonProperty("first-name")、Go では json:"first-name" タグ、C# では [JsonPropertyName("first-name")]、TypeScript ではクォート付きの "first-name" キーです。したがって生成されたコードは元の JSON を変更なくデシリアライズします。
null 値はどう扱われますか?#
値が null のフィールドは、型が不明として扱われます。TypeScript では省略可能な any(field?: any;)になり、Java と C# では Object / object に、Go では interface{} になります。これは意図的なシグナルです——null は、そのフィールドが存在するとき何を保持するかについて何も語らないため、ジェネレーターは推測することを拒否し、あなたが埋めるのに残します。