JSON サンプルを貼り付けると Java クラスの下書きが得られます。1 クラス 1 ファイルで private フィールドと getter / setter が付き、入れ子のオブジェクトと配列はそれぞれ独立したモデルクラスになります。Java で使えない名前はリネームして Jackson の @JsonProperty を付け、ソースはパッケージのフォルダ構成を保った ZIP でダウンロードできます。
ブラウザ内でローカルに実行API のレスポンス、設定ファイル、Webhook のボディなど、JSON のサンプルを貼り付けると、対応する Java クラスを書き出します。1 クラス 1 ファイルで、private フィールドと getter / setter が付きます。ルートクラス名とパッケージを指定して「JavaBean を生成」を押し、すべてのファイルを 1 つの ZIP でダウンロードするか、ページ上のコードをそのまま使います。変換はブラウザ内で実行され、貼り付けた内容が送信されることはなく、読み込み後はオフラインでも動作します。
出力のうち 2 点は意図した仕様です。フィールド名はすべて Java の識別子として有効で、名前を変えたプロパティは元の JSON 名を Jackson の @JsonProperty として保持するため、生成されたクラスは元のペイロードをそのままマッピングできます。型・クラス名・入れ子構造は貼り付けたサンプルから推定するため、完成したモデルではなく確認用の下書きになります。
文字列は String、true と false は boolean になります。32 ビットに収まる整数は int、それを超える整数は long、JavaScript が正確に表現できる範囲を超える整数は BigDecimal になり、値が黙って丸められることはありません。小数点を含む数値は double、null は String になります。単独の null には型の情報がないためです。
日付らしい文字列は java.util.Date になります。2024-05-06、2024/05/06、12/31/2024、May 6, 2024、タイムゾーン付きまたはなしの ISO 8601 形式が対象です。数字だけの値は対象外で、20240506、2024、「1-2」は String のままです。ID、年、バージョン番号が誤って日付になることはありません。
もともと有効な Java 識別子であるプロパティ名は、大文字小文字を含めてそのまま使われます。それ以外は Java が許可しない文字で分割して camelCase にします。user_name は userName、a.b は aB、user name は userName になります。Java の予約語や数字で始まる名前には先頭にアンダースコアを付けます。{"class": 1} は _class というフィールドになります。
クラス名も同じ規則で、先頭は大文字になります。さらに 2 つの保護があります。クラス名はそのファイル内で使う型と同じ名前にできないため、list というプロパティは java.util.List を隠すのではなく ListModel になります。また 2 つのオブジェクトが同じクラス名を取ることはできず、2 つ目は親の名前を付けて wrap.data は WrapData、外側の data は Data のままになります。同じオブジェクト内で user_name と userName は衝突し、2 つ目のフィールドは userName2 になります。アノテーションの import は Jackson 2 の com.fasterxml.jackson.annotation.JsonProperty です。
入れ子のオブジェクトは、それを保持するプロパティ名を持つ独立したクラスになり、フィールドはそのクラスを指します。配列は List<...> になります。文字列の配列は List<String>、オブジェクトの配列は List<Users> と Users クラス、入れ子の配列は深さを保ち、[[1,2]] は List<List<Integer>> になります。型引数は常にボックス化され、List<int> ではなく List<Integer> です。Java では型引数にプリミティブ型を書けないためです。
オブジェクトの配列では最初の要素だけでなくすべての要素を読みます。一部の要素にしかないフィールドも追加され、それらのオブジェクト内の配列は統合され、要素によって型が異なるプロパティは Object になります。空の配列には要素の型情報がないため、要素は暫定として String になります。最上位が配列の場合も同じ扱いで、すべての要素のプロパティからルートクラスを組み立てます。
各ファイルには package 行、実際に使う import、生成日時とこのページの URL を含む短い Javadoc、1 つの public クラス、そして private フィールドとその getter / setter が入ります。Lombok、ビルダー、equals、hashCode は含まれません。JDK と、名前を変更したフィールドがある場合は classpath 上の Jackson アノテーションだけで済む素直な JavaBean です。
ここではコンパイルもプロジェクトとの突き合わせも行いません。型は 1 つのサンプルから決まります。省略可能なフィールド、入れ子の null、呼び出しごとに型が変わる値はサンプルに現れず、今日 int である数値はプリミティブのフィールドになるため、後でボックス化が必要になることがあります。数百キロバイトでもブラウザ内で 1 秒未満で変換できるので大きなレスポンスでも問題ありませんが、サンプルはスキーマではなく一時点の記録です。