Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaのJacksonでJSONのフィールド名を変更する方法:@JsonPropertyアノテーションの使い方

@JsonPropertyアノテーションとは

JavaでJSONを扱う際に広く使われているライブラリ「Jackson」には、@JsonPropertyというアノテーションが用意されています。このアノテーションは、JSONのシリアライズ(Javaオブジェクト→JSON)デシリアライズ(JSON→Javaオブジェクト)の処理において、プロパティやメソッドに対して指定することができます。

@JsonPropertyには、オプションの「name」パラメータを渡すことができます。これは、Javaクラスのプロパティ名と、JSON側のキー名が異なる場合に非常に便利です。

  • キー名とプロパティ名が一致している場合:値はそのまま対応するプロパティにマッピングされる
  • 名前が異なる場合:@JsonPropertyで明示的にキー名を指定することで正しくマッピングできる

@JsonPropertyでフィールド名を変更するサンプルコード

それでは、実際に@JsonPropertyアノテーションを使って、JSON出力時のフィールド名を変更してみましょう。以下の例では、Userクラスの各フィールドに対して、任意のJSONキー名を指定しています。

import java.io.IOException;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.annotation.JsonProperty;

public class JsonPropertyAnnotationTest {
    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(SerializationFeature.INDENT_OUTPUT);
        User user = new User("Sai", "Adithya", "9959984000", "0402358700");
        String data = mapper.writeValueAsString(user);
        System.out.println(data);
    }
}

// Userクラス
class User {
    @JsonProperty("first-name")
    public String firstName;

    @JsonProperty("last-name")
    public String lastName;

    @JsonProperty("mobile-phone")
    public String mobilePhone;

    @JsonProperty("home_phone")
    public String workPhone;

    public User(String firstName, String lastName, String mobilePhone, String workPhone) {
        super();
        this.firstName = firstName;
        this.lastName = lastName;
        this.mobilePhone = mobilePhone;
        this.workPhone = workPhone;
    }
}

コードのポイント

  • @JsonProperty("first-name")のように、JSON上で使用したいキー名を引数として指定します。
  • 例ではハイフン区切り(first-name)やアンダースコア区切り(home_phone)など、異なる命名規則のキー名を混在させて指定しています。
  • SerializationFeature.INDENT_OUTPUTを有効にすることで、出力されるJSONが整形され、読みやすくなります。

実行結果

上記のコードを実行すると、Javaのフィールド名ではなく、@JsonPropertyで指定したキー名が出力されていることが確認できます。

{
    "first-name" : "Sai",
    "last-name" : "Adithya",
    "mobile-phone" : "9959984000",
    "home_phone" : "0402358700"
}

まとめ

Jacksonの@JsonPropertyアノテーションを使えば、Javaクラスのフィールド名をそのままに、JSON側のキー名を自由に制御できます。外部APIの仕様に合わせたキー名への変換や、スネークケース・ケバブケースなど命名規則の違いを吸収したい場合に非常に有効な手段です。シリアライズだけでなくデシリアライズにも適用されるため、入出力の両方向で一貫したマッピングを実現できます。

  1. JavaでJacksonを使ってJSONオブジェクトを列挙型(Enum)に変換する方法

    JSONObjectは、文字列からテキストを解析してMap形式のオブジェクトを生成できます。一方、列挙型(Enum)は定数の集合を定義するために使用されます。数値やテキストデータとして表現できない、あらかじめ決められた値のリストが必要な場合に列挙型が役立ちます。 JSONオブジェクトを列挙型に変換するには、ObjectMapperクラスのreadValue()メソッドを使用します。このメソッドは、JSON文字列を指定したJavaクラス(POJO)にデシリアライズする際に、フィールドの型が列挙型であれば自動的に対応するEnum定数へとマッピングしてくれます。 以下の例では、Jacksonライブラ

  2. Javaで既存のJSONファイルにJSON文字列を追加する方法【Gson活用ガイド】

    GsonはJava向けの代表的なJSONライブラリで、JSONデータの生成や解析に幅広く利用されています。既存のJSONファイルに新しいJSON文字列を追加するには、いくつかのステップを踏む必要があります。 処理の流れ 基本的な手順は以下のとおりです。 JSONファイルを読み込み、Javaオブジェクトとしてパースします。 JavaオブジェクトをJsonObjectに型キャストし、さらにJsonArrayとして取得します。 JSON配列を反復処理しながら、各JsonElementを出力します。 JsonWriterクラスを使用すると、JSONエンコードされた値を1トークンずつストリームへ書き込