JSON to Java POJO — JSON から Java POJO クラスを生成
JSON から Jackson アノテーション付きの Java POJO クラスを生成します。Immutable な record、nullable フィールド、Lombok 対応 —— ブラウザだけで完結、アップロード不要。
JSON to Java POJO
Convert JSON to Java POJO class with Jackson annotations. Works entirely in your browser.
Java は何十年にもわたってエンタープライズアプリケーション開発の根幹を担ってきましたが、JSON シリアライズに関するその取り組み方は、どの言語よりも成熟したエコシステムと言えます。事実上の標準である Jackson は、クラス構造が JSON の形に一致していれば、設定ゼロで JSON をプレーンな Java オブジェクト(POJO)にデシリアライズできます —— ただし、そのクラス構造自体が存在しなければなりません。あらゆる API レスポンスに対して手作業で Java クラスを作成するのは、エンドポイント数に対して線形に増えていく手間です。さらにその生成されたクラスは、すべての下流レイヤーの入力になります。JSON として返す controller、それを変換する service、そしてそれを永続化する repository です。生成器は JSON レスポンスを辿り、Java の型を推測し、プロジェクトに直接コンパイルできるクラスとして出力します。
Java 特有で、あまり自明ではない考慮点は、record と POJO のどちらを選ぶかです。Java 16 で導入された Java record は、immutable なデータキャリアを簡潔に書くための構文です。1 行の record User(String name, int age) は、コンストラクタ、equals、hashCode、toString まで備えた完全な POJO と等価になります。Jackson は canonical constructor に付与された @JsonCreator アノテーションを通じて record をネイティブにサポートします。Java 16+ の新しいコードベースでは、record が適切なデフォルトです。より短く、より安全で、また setter を持つ mutable な POJO と比べて「これはデータオブジェクトである」という意図をより明確に表現できるためです。Mutable な状態が必要なコードベース、プロキシを生成するフレームワーク(JPA、Spring AOP)、あるいは Java 16 以前のランタイムで動作するプロジェクトでは、POJO が依然として正しい選択肢です。
POJO を生成した後のもっとも一般的な次のステップは、それを Spring Boot の controller に組み込むことです。クラスに @RestController を付与し、その POJO を返す @GetMapping メソッドを追加すれば、Jackson が自動的にシリアライズを処理します。送信先が Kafka の topic であれば、@Serde アノテーションを追加するか、Jackson の ObjectMapper を直接利用してください。生成されたクラスがデータコントラクトです。それを検証・変換・永続化するビジネスロジックこそが、開発者の手によって書くべき部分です。
使い方
JSON を貼り付ける
JSON オブジェクト、またはオブジェクトの配列を入力欄にドロップしてください。生成器が構造を辿り、ルートに Java クラスを出力し、各オブジェクトの形ごとにネストされた static 内部クラスを生成します。
record スタイルと class スタイルを選ぶ
Java 16+ の record(immutable、コンパクトなコンストラクタ構文)と、従来の POJO(private フィールド、getter、setter)のどちらかを選べます。Jackson アノテーションをオンにすると `@JsonProperty`、`@JsonIgnoreProperties`、`@JsonCreator` を付与します。
.java ファイルをコピーまたはダウンロード
生成された Java をクリップボードにコピーするか、.java ファイルとしてダウンロードできます。出力は `javac` でコンパイルでき、Jackson の `ObjectMapper` とそのまま動作します —— 余計な import ファイルは不要です。
よくある質問
record と POJO はどちらを選ぶべきですか?
Java record(Java 16+)は設計上 immutable で、Jackson の `@JsonCreator` を使ったデシリアライズと相性が良いです。Immutable であることが重要で、かつプロジェクトが Java 16 以降で動作する場合は record を選んでください。Mutable なフィールドや setter が必要な場合、あるいは古いランタイムとの互換性が必要な場合は POJO を選んでください。
JSON のキーは Java のフィールド名にどうマップされますか?
デフォルトでは snake_case の JSON キー(`user_id`)は camelCase の Java フィールド(`userId`)に変換され、同時に `@JsonProperty("user_id")` アノテーションが付与されるため、Jackson の `ObjectMapper` でも元のキーが維持されます。アノテーションをオフにすれば、Jackson のデフォルトの property-naming-strategy に任せられます。
nullable なフィールドはどのように扱われますか?
サンプルで null になっているフィールドは `@Nullable` の参照型として出力されます。プリミティブ型(`int`、`boolean`)は null を保持できるように boxed 型(`Integer`、`Boolean`)にラップされます。API 側で値の存在が保証されている場合は、手動で `@NotNull` や `@NonNull` を追加してください。
Lombok アノテーションは生成されますか?
はい —— 「Lombok」をオンにすると、手書きの getter や setter の代わりに `@Data`、`@NoArgsConstructor`、`@AllArgsConstructor` を出力します。どちらの形式でも生成されるコードはクリーンな Java です。Lombok はすでに同アノテーションを使っているコードベース向けのショートカットに過ぎません。
配列・コレクションについてはどうですか?
JSON 配列は `List<T>` フィールドになります。生成器は `import java.util.List;` を出力し、リスト要素の型としてジェネリック型を使用します。Jackson は、要素型が concrete class である限り、型付きのコレクションでも自動的にデシリアライズします。
制限事項
- JPA エンティティのアノテーションは付与されない出力は JSON デシリアライズ用の POJO であり、Hibernate 用の JPA エンティティではありません。生成したクラスをデータベースのテーブルにもマップする場合は、手動で `@Entity`、`@Id`、`@Column` を追加してください。
- enum は検出されない決まった値の間で切り替わる文字列フィールドは、Java の enum ではなく String として出力されます。出力を確認し、必要に応じて `public enum Status { ACTIVE, PENDING, CLOSED }` のような定義を手動で追加してください。
- 型は単一のサンプルから推測されるサンプルでは整数だが、他のレスポンスでは小数になる可能性があるフィールドは `int` として型付けされます。API の返す値が一貫していない場合は、出力を確認し、必要に応じて `double` や `BigDecimal` に広げてください。
プラットフォーム別の注意点
- macOS
- IntelliJ IDEA、Eclipse、Java 拡張パックを入れた VS Code はいずれも生成されたクラスを受け付けます。プロトタイピング中や API ドキュメントのページから貼り付ける場面など、その場限りの変換にはブラウザツールが便利です。
- Windows
- Windows 版の IntelliJ でも、生成されたクラスはまったく同じように扱えます。完全な IDE を立ち上げずに手早くクラスを生成したいときは、ブラウザツールが適切な選択肢です。
- Linux
- コマンドライン系の作業であれば、標準的な同等ツールは `jsonschema2pojo` です。その場限りの生成で、Maven や Gradle を入れるほどのセットアップが割に合わない場面では、ブラウザツールが適切な選択肢です。
- Web
- 完全にクライアントサイドで動作します。ページの読み込みが完了すれば、オフラインでも使えます。