型生成

JSONからJavaAPIの実例からモデルの下書きへ

配列を入力した場合、出力は要素のクラスです。配列全体はList<Root>として読み込みます。

JSONからJava

JSON入力

解析と生成はブラウザー内で行い、入力は送信・保存しません。

生成ソース

生成設定

Jackson 2.x用です。Kotlinには専用モジュールが必要です。推論は検証ではありません。下の設定を確認してください。

配列入力の出力は要素モデルです。List<Root>として読み込みます。

2クラス・2可空フィールド

APIのレスポンスしか手元にないとき、JSONからJavaでモデルの下書きを作れます。複数の実例を配列にすると、2件目以降で現れるプロパティやnullも判断材料になります。

JSONをPOJOに変換しても、その型がAPIの仕様を証明するわけではありません。必須項目や許される値は、実際の契約と照合してください。

JSONからJavaを生成する理由

先頭の要素だけで判断しない

JSONからJavaは同じ配列位置にある全オブジェクトのフィールドを統合します。あるレコードで欠けている項目も残し、欠落やnullの証拠を可空型に反映します。

異なる項目を持つ2枚のカードが1つのモデルに合流し、欠落項目を中空の印で示す図。

元のキーと名前を対応させる

Javaクラス生成では記号入りのキーをそのまま名前にできません。安全な識別子に直し、Jacksonアノテーションで元の綴りと結び付けます。名前の衝突には連番を付けます。

不規則なキーが色付きの線で安全なプロパティと入れ子のクラスにつながる図。

見落としやすい設定を確認

01

差分のあるサンプルを集める

ルートはオブジェクト、またはオブジェクトのみの空でない配列にします。配列は要素モデルを推論するためのもので、架空のラッパープロパティは作りません。

02

可空とクラス配置を選ぶ

観測モードでは欠落またはnullのある項目を可空にします。全項目モードはJavaのプリミティブをボックス化し、Kotlinに?とnullの既定値を付けます。入れ子をオフにすると補助クラスが同一ファイルのトップレベルに並びます。

03

最新の結果を保存する

自動生成は350ms待ちます。オフなら生成ボタンかCtrl/Cmd+Enterを使用します。編集するとコピーと保存は無効になり、クリアやサンプル読込は1回取り消せます。

型とプロパティの決め方

数値の表記を読む

符号付き64ビットに収まる通常の整数はlong/Long、それより大きい整数はBigIntegerです。1.0や1e3も含め、小数と指数表記はBigDecimalになり、JavaScriptの浮動小数点を経由しません。

Kotlinのコンストラクタ

同じ画面でKotlinのdata classを選べます。欠落やnullを観測した項目はT? = null、非nullの項目には既定値を付けません。空のルートオブジェクトは引数のない通常のclassになります。

名前と注釈の対象

ASCIIのキャメルケースを生成し、予約語と重複名を調整します。Javaのフィールド、Kotlinの引数とgetterにそれぞれJsonPropertyを付けます。型は完全修飾名なので、ルート名がStringでも衝突しません。

1つのソースファイル

Javaはpublicフィールドとstaticの入れ子クラス、Kotlinは入れ子のデータクラスが既定です。入れ子を解除したJavaの補助クラスはpublicにならず、そのまま1ファイルに収まります。

利用条件と推論の範囲

Jacksonの設定が必要
注釈はJackson 2.x用です。Kotlinにはjackson-module-kotlinとkotlin-reflectも必要です。非nullの検査にはFAIL_ON_NULL_FOR_PRIMITIVESとStrictNullChecksを設定します。Javaの参照型はnullを保持でき、生成モデルだけでは検証になりません。
不明な型の数値精度
混在する型やnullだけの項目はObject/Any、空配列は不明な要素型、内部の空オブジェクトはMapになります。精度を保つにはUSE_BIG_INTEGER_FOR_INTSとUSE_BIG_DECIMAL_FOR_FLOATSを有効にします。空のルートクラスの書出しではFAIL_ON_EMPTY_BEANSを無効にします。
表現できないキーは停止
空文字列のJsonPropertyは既定名を意味するため、本当の空キーは拒否します。注釈をオフにして名前の変更が必要になった場合もエラーです。Mapや独自のデコーダーで扱ってください。
テンプレートの範囲
JSON Schema、OpenAPI、Lombok、record、Gson、日付やenumの推論はありません。文字列はStringのままです。ルートのスカラー、空配列、異種配列は拒否し、欠落と明示的nullの3状態管理もしません。
有限の生成予算
厳密なJSONのみ対応し、コメント、重複キー、修復、URL取得、ファイル読込はありません。上限は入力500,000文字、50,000ノード、深さ40、各オブジェクト100項目、200クラス、キーと数値各1,000文字、指数の絶対値10,000、出力1,000,000文字です。

JSONからJavaのよくある質問

数値の型はどう推論されますか?

JSONからJavaは元の数値トークンを使い、long/Long、BigInteger、BigDecimalを選びます。Object/Anyに入る数値については、上のデコーダー設定も確認してください。

配列が空の場合はどうなりますか?

空のルート配列はモデルの根拠がないため拒否します。オブジェクト内部の空配列はList<Object>やList<Any?>になり、同じ位置の別サンプルに値があればその型を使います。

Jackson、Lombok、recordのどれを選べますか?

このページはJackson用のフィールドクラスとKotlinモデルに絞っています。Lombokやrecordを出力するスイッチはありません。必要なら保存後にプロジェクトの方針に合わせて変更してください。

別の言語へ変換できますか?

ここではJavaとKotlinを切り替えられます。入力を共有したまま出力が更新され、ファイル拡張子も変わります。ほかの言語は関連ツールから選んでください。

JsonPropertyはいつ付きますか?

注釈をオンにすると全フィールドに元のキーを記録します。Kotlinでは引数とgetterの両方が対象です。オフの場合、名前を変えないと表現できないキーがあると生成を止めます。

見直したい推論例がありますか?

プロジェクトで動作を確かめる

JSONからJavaで複数のレスポンスを見比べ、可空型とJackson設定を確認してから、保存したソースをプロジェクトでコンパイルしてください。