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)の付与は必須です。