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

Javaで@JsonCreatorアノテーションを使ってJSON文字列を逆シリアル化する方法

Jacksonライブラリの@JsonPropertyアノテーションは、JSON内のプロパティ名を明示的に指定するために使用されます。このアノテーションは、コンストラクタファクトリメソッドの引数に対して適用できます。

@JsonCreatorアノテーションは、@JsonSetterアノテーションが使用できない状況で特に有用です。例えば、イミュータブル(不変)オブジェクトにはセッターメソッドが存在しないため、初期値をコンストラクタ経由で注入する必要があります。本記事では、@JsonCreatorをコンストラクタおよびファクトリメソッドに適用して、JSON文字列をJavaオブジェクトへ逆シリアル化する方法を、コード例と実行結果とともに解説します。

@JsonCreatorをコンストラクタに付与する例

まずは基本となるパターンです。@JsonCreatorをコンストラクタに付与し、各引数を@JsonPropertyでJSONのキー名に対応させています。これにより、JSON側のキー(fullnameやlocation)とJavaクラスのフィールド名(nameやaddress)が異なっていても、正しく値をマッピングできます。

サンプルコード

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

public class JsonCreatorTest1 {
    public static void main(String[] args) throws IOException {
        ObjectMapper om = new ObjectMapper();
        String jsonString = "{\"id\":\"101\", \"fullname\":\"Ravi Chandra\", \"location\":\"Pune\"}";
        System.out.println("JSON: " + jsonString);
        Customer customer = om.readValue(jsonString, Customer.class);
        System.out.println(customer);
    }
}

// Customerクラス
class Customer {
    private String id;
    private String name;
    private String address;

    public Customer() {
    }

    @JsonCreator
    public Customer(
        @JsonProperty("id") String id,
        @JsonProperty("fullname") String name,
        @JsonProperty("location") String address) {
        this.id = id;
        this.name = name;
        this.address = address;
    }

    @Override
    public String toString() {
        return "Customer [id=" + id + ", name=" + name + ", address=" + address + "]";
    }
}

実行結果

JSON: {"id":"101", "fullname":"Ravi Chandra", "location":"Pune"}
Customer [id=101, name=Ravi Chandra, address=Pune]

この例では、ObjectMapperのreadValue()メソッドがJSON文字列を解析する際、@JsonCreatorが付与されたコンストラクタを呼び出し、@JsonPropertyで指定されたキー名に基づいて各引数へ値が渡されます。その結果、「fullname」は「name」へ、「location」は「address」へと正しくマッピングされています。

@JsonCreatorをファクトリメソッドに付与する例

次に、@JsonCreatorをstaticファクトリメソッドに付与するパターンを紹介します。オブジェクト生成時に独自のロジック(バリデーションやデフォルト値の設定など)を挟みたい場合に有効な手法です。

サンプルコード

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

public class JsonCreatorTest2 {
    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        String jsonString = "{\"id\":\"102\", \"fullname\":\"Raja Ramesh\", \"location\":\"Hyderabad\"}";
        System.out.println("JSON: " + jsonString);
        Customer customer = mapper.readValue(jsonString, Customer.class);
        System.out.println(customer);
    }
}

// Customerクラス
class Customer {
    private String id;
    private String name;
    private String address;

    public Customer() {
    }

    @JsonCreator
    public static Customer createCustomer(
        @JsonProperty("id") String id,
        @JsonProperty("fullname") String name,
        @JsonProperty("location") String address) {
        Customer customer = new Customer();
        customer.id = id;
        customer.name = name;
        customer.address = address;
        return customer;
    }

    @Override
    public String toString() {
        return "Customer [id=" + id + ", name=" + name + ", address=" + address + "]";
    }
}

実行結果

JSON: {"id":"102", "fullname":"Raja Ramesh", "location":"Hyderabad"}
Customer [id=102, name=Raja Ramesh, address=Hyderabad]

ファクトリメソッド方式では、createCustomer()メソッド内でCustomerインスタンスを生成し、フィールドへ値を設定したうえで返却しています。生成処理を一箇所に集約できるため、複雑な初期化ロジックが必要なケースでも柔軟に対応できます。

ポイントまとめ

  • @JsonCreatorは、コンストラクタにもstaticファクトリメソッドにも付与できます。
  • 各引数は@JsonPropertyを使って、JSON側のキー名と明示的に対応付けます。
  • セッターメソッドを持たないイミュータブルなクラスや、JSONのキー名とフィールド名が異なる場合の逆シリアル化に特に有効です。
  • ファクトリメソッドを利用すれば、オブジェクト生成時のバリデーションや値の変換処理などを組み込むことも可能です。
  1. 【Java入門】Gsonライブラリを使ってJSON文字列をファイルに書き込む方法

    GsonライブラリとはGsonは、JavaオブジェクトをJSON形式に変換(シリアライズ)するためのGoogle製オープンソースライブラリです。逆に、JSON文字列からJavaオブジェクトへの変換(デシリアライズ)も簡単に行えるため、JavaでJSONを扱う際の定番ライブラリとして広く利用されています。Gsonを使用する際の中心的なクラスはGsonクラスです。インスタンスはnew Gson()のように直接生成できますが、設定をカスタマイズしたい場合はGsonBuilderクラスを使ってGsonインスタンスを作成することも可能です。この記事では、Gsonクラスが提供するtoJson()メソッドを

  2. JavaでJSONファイルを文字列(String)として読み込む方法

    この記事では、JavaでJSONファイルをString型の変数として読み込む方法を解説します。特にAPIテストの際に、エンドポイントへJSONペイロードをPOSTしたいケースなどで非常に便利なテクニックです。 JSONペイロードをあらかじめファイルとして保存しておき、そのファイルを文字列として読み込めば、POSTリクエストのボディとしてそのまま利用できます。 JSONファイルを文字列として読み込む基本手法 まず、以下の場所にJSONファイルが配置されているものと仮定します。 src/test/resources/myFile.json { name:David, age:30, h