Jackson @JsonProperty で snake_case JSON キーをマッピングする

Jackson の @JsonProperty で snake_case の JSON キーと camelCase の Java フィールド名をブリッジします。クラス全体に適用する @JsonNaming も合わせて解説。

Annotations

詳細な説明

@JsonProperty で命名規則をブリッジする

Java フィールドは camelCase、多くの JSON API(Stripe、GitHub、Slack、AWS)は snake_case です。Jackson の @JsonProperty はどの JSON キーがどの Java フィールドに対応するかをデシリアライザに伝えます。

JSON の例

{
  "user_id": 42,
  "first_name": "Alice",
  "last_name": "Williams",
  "is_active": true
}

@JsonProperty 付きの Java

package com.example.model;

import com.fasterxml.jackson.annotation.JsonProperty;

public class User {
    @JsonProperty("user_id")
    private Integer userId;

    @JsonProperty("first_name")
    private String firstName;

    @JsonProperty("last_name")
    private String lastName;

    @JsonProperty("is_active")
    private Boolean isActive;
    // アクセサ
}

ジェネレーターは JSON キーが camelCase 化された Java フィールド名と異なる場合にだけアノテーションを出力します。email のように一致するキーには付与されず、user_id のような場合に付きます。

代替案:@JsonNaming

ペイロード全体が snake_case なら、クラスレベルのアノテーション 1 つの方が簡潔です。

@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class User {
    private Integer userId;
    private String firstName;
    // ...
}

これでフィールドごとのアノテーションが不要になります。例外的なキーがあれば @JsonProperty でケースバイケースに上書きできます。

グローバル設定

ObjectMapper 全体に戦略を適用することもできます。

ObjectMapper mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);

使い分けの目安

  • フィールド単位の @JsonProperty — 一部のキーだけが camelCase と異なる、あるいは命名規則が一貫していない場合。
  • @JsonNaming — クラス全体が snake_case や kebab-case など 1 つの戦略で統一されている場合。
  • ObjectMapper のグローバル設定 — アプリ全体のすべてのペイロードが同じ規則の場合。

よく使う他の Jackson アノテーション

  • @JsonIgnore — シリアライズ対象から除外
  • @JsonInclude(NON_NULL) — null フィールドを出力しない
  • @JsonAlias — 複数の入力キー名を許容
  • @JsonFormat — 日付や数値のフォーマット制御

ユースケース

ここ 10 年に公開されたほぼすべての公開 REST API は JSON キーに snake_case を使っています。Java 側のフィールド名を不自然に変えたくない限り、@JsonProperty(または @JsonNaming)の付与は必須です。

試してみる — JSON to Java

フルツールを開く