APIからJSONレスポンスを受け取り、Javaクラスにデシリアライズする必要があります。フィールド宣言、getter/setter、ネストクラス、@JsonPropertyアノテーション——手書きは時間がかかり、ミスも起きやすい。JSONを貼り付けるだけで、数秒でPOJOクラスが生成できます。
Java POJOを手書きする手間
APIレスポンス用のJava POJOを手書きするには:
- すべてのJSONキーに対して正しい型のフィールドを宣言する
- フィールドごとにgetterとsetterを書く(Lombokを使わない場合)
- snake_caseのJSONキーをcamelCaseのJavaフィールドにマッピングする
@JsonPropertyを追加する - ネストされたオブジェクトごとに別のクラスを定義する
- NullPointerExceptionを避けるためnullableフィールドを慎重に処理する
- JacksonやGsonのデシリアライズに必要な引数なしコンストラクタを保持する
フラットなオブジェクトならまだ良いですが、3段ネスト・配列・混在したケーシングがあるレスポンスでは、かなりの工数になります。
JSON to Java POJOジェネレーターの動作
JSONを入力すると、正しい型とJacksonアノテーション付きのJavaクラスが生成されます。次のJSONを例にすると:
{
"user": {
"id": 42,
"user_name": "田中太郎",
"email": "[email protected]",
"is_active": true,
"roles": ["admin", "editor"],
"address": {
"prefecture": "東京都",
"city": "渋谷区"
},
"last_login": null
}
}
生成されるクラス:
public class Address {
@JsonProperty("prefecture")
private String prefecture;
@JsonProperty("city")
private String city;
// getters and setters
}
public class User {
@JsonProperty("id")
private Integer id;
@JsonProperty("user_name")
private String userName;
@JsonProperty("email")
private String email;
@JsonProperty("is_active")
private Boolean isActive;
@JsonProperty("roles")
private List<String> roles;
@JsonProperty("address")
private Address address;
@JsonProperty("last_login")
private Object lastLogin;
// getters and setters
}
public class Root {
@JsonProperty("user")
private User user;
// getters and setters
}
ZeroTool JSON to Java POJOジェネレーターを試す →
JSONを貼り付けると即座にJavaクラスが生成されます。インストール不要、ブラウザ内ですべて動作するため、機密データもサーバーに送信されません。
型推論のルール
| JSONの値 | Javaの型 |
|---|---|
"string" | String |
42 | Integer |
3.14 | Double |
true / false | Boolean |
null | Object |
[1, 2, 3] | List<Integer> |
[{…}, {…}] | List<ClassName> |
{} | 名前付きクラス |
プリミティブ型(int、boolean)ではなくボックス型(Integer、Boolean)を使うことで、フィールドがnullを保持できます。
snake_caseからcamelCaseへの変換
user_nameというJSONキーはJavaフィールドuserNameに変換され、@JsonProperty("user_name")が自動的に追加されます。Jacksonはこのアノテーションを使ってデシリアライズ時にフィールドを対応付けます。
Lombokでボイラープレートを削除
生成されたクラスにはデフォルトでgetter/setterが含まれます。Lombokを使えば大幅に簡略化できます:
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonProperty;
@Data
public class User {
@JsonProperty("id")
private Integer id;
@JsonProperty("user_name")
private String userName;
@JsonProperty("email")
private String email;
@JsonProperty("is_active")
private Boolean isActive;
}
@Dataはequals()、hashCode()、toString()、すべてのgetter/setterを自動生成します。読み取り専用のモデルには@Valueを使うとフィールドがfinalになります。
統合パターン
Spring Boot + Jackson(RestTemplate)
RestTemplate restTemplate = new RestTemplate();
Root root = restTemplate.getForObject(
"https://api.example.com/users/1",
Root.class
);
String city = root.getUser().getAddress().getCity();
Spring BootはデフォルトでJacksonを使用します。生成したクラスをそのまま型パラメータとして指定できます。
Spring Boot + WebClient(リアクティブ)
WebClient client = WebClient.create("https://api.example.com");
Mono<Root> result = client.get()
.uri("/users/1")
.retrieve()
.bodyToMono(Root.class);
ObjectMapper(手動)
ObjectMapper mapper = new ObjectMapper();
Root root = mapper.readValue(jsonString, Root.class);
Gson
GsonをJacksonの代わりに使う場合:
Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.create();
Root root = gson.fromJson(jsonString, Root.class);
LOWER_CASE_WITH_UNDERSCORESを指定することで、snake_caseのJSONキーをcamelCaseのJavaフィールドに自動マッピングします。
生成後に確認すべきポイント
大きなIDはLongに変更
Integer.MAX_VALUEは約21億です。データベースのシーケンスやTwitter/雪花IDはこれを超える場合があります:
// 生成されたもの
private Integer id;
// 正しい型
private Long id;
空の配列の要素型
[]は要素の型情報を持たないため、List<Object>が生成されます。APIドキュメントを確認して正しい型に変更してください:
// 生成されたもの
private List<Object> items;
// 修正後
private List<OrderItem> items;
日付・時刻フィールド
JSONにはネイティブの日付型がありません。タイムスタンプは文字列("2026-04-17T10:00:00+09:00")または数値(Unixエポック)で渡されます。LocalDateTimeに直接デシリアライズする場合:
// pom.xmlに追加
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
@JsonProperty("last_login")
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime lastLogin;
nullフィールドの実際の型
サンプルJSONでnullのフィールドは、型情報がないためObjectで生成されます。APIドキュメントを参照して実際の型に書き換えてください。
Java 16+ Recordという選択肢
Java 16以降を使用している場合、POJOの代わりにRecordを使えます:
public record User(
@JsonProperty("id") Integer id,
@JsonProperty("user_name") String userName,
@JsonProperty("email") String email,
@JsonProperty("is_active") Boolean isActive
) {}
Recordは不変でコンパクト、かつequals()・hashCode()・toString()・アクセサメソッドを自動生成します。Jackson 2.12以降でRecordのシリアライズ/デシリアライズに対応しています。
まとめ
Java POJOを手書きするのは、ツールに任せるべき繰り返し作業です。ジェネレーターはネストクラス、型推論、snake_case変換、Jacksonアノテーションをすべて処理します。生成後に確認するポイント:
- 大きなIDフィールドを
Longに変更 List<Object>を正しいジェネリクス型に変更nullフィールドを実際の型に書き換え- 日付フィールドに
@JsonDeserializeを追加 - Lombokの
@Dataでgetter/setterを削除