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

JavaでGsonのカスタムインスタンスクリエーター(InstanceCreator)を使う方法

JSON文字列をJavaオブジェクトへ変換する(またはその逆を行う)際、Gsonはデフォルトでデフォルトコンストラクタを呼び出してJavaクラスのインスタンスを生成します。しかし、対象となるJavaクラスにデフォルトコンストラクタが存在しない場合や、オブジェクト生成時に何らかの初期設定を行いたい場合には、独自のインスタンスクリエーターを作成してGsonに登録する必要があります。

Gsonでカスタムインスタンスクリエーターを作成するには、InstanceCreatorインターフェースを使用し、createInstance(Type type)メソッドを実装します。

構文

T createInstance(Type type)

実装例

以下は、引数付きコンストラクタしか持たないCourseクラスに対して、カスタムインスタンスクリエーターを適用する例です。CourseCreatorクラスがInstanceCreator<Course>を実装し、technologyフィールドに初期値「Java」を設定したインスタンスを返しています。

import java.lang.reflect.Type;
import com.google.gson.*;

public class CustomInstanceCreatorTest {
    public static void main(String args[]) {
        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.registerTypeAdapter(Course.class, new CourseCreator());
        Gson gson = gsonBuilder.create();
        String jsonString = "{'course1':'Core Java', 'course2':'Advanced Java'}";
        Course course = gson.fromJson(jsonString, Course.class);
        System.out.println(course);
    }
}

// Course クラス
class Course {
    private String course1;
    private String course2;
    private String technology;

    public Course(String technology) {
        this.technology = technology;
    }

    public void setCourse1(String course1) {
        this.course1 = course1;
    }

    public void setCourse2(String course2) {
        this.course2 = course2;
    }

    public String getCourse1() {
        return course1;
    }

    public String getCourse2() {
        return course2;
    }

    public void setTechnology(String technology) {
        this.technology = technology;
    }

    public String getTechnology() {
        return technology;
    }

    @Override
    public String toString() {
        return "Course[ " +
                "course1 = " + course1 +
                ", course2 = " + course2 +
                ", technology = " + technology +
                " ]";
    }
}

// カスタムインスタンスクリエーター
class CourseCreator implements InstanceCreator<Course> {
    @Override
    public Course createInstance(Type type) {
        return new Course("Java");
    }
}

処理の流れ

  1. registerTypeAdapter()メソッドを使って、CourseクラスとCourseCreatorを関連付けてGsonに登録します。
  2. fromJson()が呼び出されると、Gsonは通常のデフォルトコンストラクタの代わりに、CourseCreator#createInstance()を呼び出してインスタンスを生成します。
  3. ここではtechnologyフィールドに「Java」という初期値を設定した状態でCourseオブジェクトを作成しています。
  4. その後、JSON文字列内の各プロパティ(course1course2)が対応するフィールドにマッピングされます。

出力結果

Course[ course1 = Core Java, course2 = Advanced Java, technology = Java ]

このようにInstanceCreatorを活用すれば、コンストラクタに引数が必要なクラスや、生成時に特定の初期化処理を行いたいクラスでも、GsonによるJSON変換を問題なく利用できるようになります。依存性の注入が必要なクラスや、ファクトリメソッド経由でのみ生成すべきクラスを扱う場合にも特に有効な手法です。

  1. 【Java入門】Gsonライブラリを使ってJSON文字列をファイルに書き込む方法

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

  2. JavaのGsonライブラリでJSONを整形出力(Pretty Print)する方法

    Gsonは、Googleが開発したJava向けのJSONライブラリです。Gsonを利用することで、JavaオブジェクトからJSONを生成したり、JSON文字列をJavaオブジェクトへ変換(デシリアライズ)したりできます。 デフォルトでは、Gsonは余計な空白や改行を省いたコンパクト形式でJSONを出力します。ログの確認やデバッグ時にJSONを読みやすくしたい場合は、整形出力(Pretty Print)を有効にしましょう。そのためには、GsonBuilderクラスのsetPrettyPrinting()メソッドを使ってGsonインスタンスを構成します。このメソッドを呼び出すことで、インデントと改