Gson-custom-adapters

提供:Dev Guides
移動先:案内検索

Gson-カスタムタイプアダプター

Gsonは、組み込みのアダプターを使用してオブジェクトのシリアル化/逆シリアル化を実行します。 また、カスタムアダプタもサポートしています。 カスタムアダプタの作成方法と使用方法について説明します。

カスタムアダプターを作成する

*TypeAdapter* クラスを拡張し、ターゲットのオブジェクトのタイプを渡すことにより、カスタムアダプターを作成します。 *read* メソッドと *write* メソッドをオーバーライドして、それぞれカスタムの逆シリアル化とシリアル化を実行します。
class StudentAdapter extends TypeAdapter<Student> {
   @Override
   public Student read(JsonReader reader) throws IOException {
      ...
   }

   @Override
   public void write(JsonWriter writer, Student student) throws IOException {
   }
}

カスタムアダプターを登録する

GsonBuilderを使用してカスタムアダプターを登録し、 GsonBuilder を使用してGsonインスタンスを作成します。

GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Student.class, new StudentAdapter());
Gson gson = builder.create();

アダプターを使用する

Gsonは、カスタムアダプターを使用してJsonテキストをオブジェクトに、またはその逆に変換します。

String jsonString = "{\"name\":\"Mahesh\", \"rollNo\":1}";
Student student = gson.fromJson(jsonString, Student.class);
System.out.println(student);
jsonString = gson.toJson(student);
System.out.println(jsonString);

動作中のカスタムタイプアダプターの例を見てみましょう。 C:\> GSON_WORKSPACEに GsonTester という名前のJavaクラスファイルを作成します。

*_File-GsonTester.java_*
import java.io.IOException;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;

public class GsonTester {
   public static void main(String args[]) {

      GsonBuilder builder = new GsonBuilder();
      builder.registerTypeAdapter(Student.class, new StudentAdapter());
      builder.setPrettyPrinting();
      Gson gson = builder.create();

      String jsonString = "{\"name\":\"Mahesh\", \"rollNo\":1}";
      Student student = gson.fromJson(jsonString, Student.class);
      System.out.println(student);

      jsonString = gson.toJson(student);
      System.out.println(jsonString);
   }
}

class StudentAdapter extends TypeAdapter<Student> {
   @Override
   public Student read(JsonReader reader) throws IOException {
      Student student = new Student();
      reader.beginObject();
      String fieldname = null;

      while (reader.hasNext()) {
         JsonToken token = reader.peek();

         if (token.equals(JsonToken.NAME)) {
           //get the current token
            fieldname = reader.nextName();
         }

         if ("name".equals(fieldname)) {
           //move to next token
            token = reader.peek();
            student.setName(reader.nextString());
         }

         if("rollNo".equals(fieldname)) {
           //move to next token
            token = reader.peek();
            student.setRollNo(reader.nextInt());
         }
      }
      reader.endObject();
      return student;
   }

   @Override
   public void write(JsonWriter writer, Student student) throws IOException {
      writer.beginObject();
      writer.name("name");
      writer.value(student.getName());
      writer.name("rollNo");
      writer.value(student.getRollNo());
      writer.endObject();
   }
}

class Student {
   private int rollNo;
   private String name;

   public int getRollNo() {
      return rollNo;
   }

   public void setRollNo(int rollNo) {
      this.rollNo = rollNo;
   }

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String toString() {
      return "Student[ name = "+name+", roll no: "+rollNo+ "]";
   }
}

結果を検証する

次のように javac コンパイラを使用してクラスをコンパイルします-

C:\GSON_WORKSPACE>javac GsonTester.java

今すぐ GsonTester を実行して結果を確認します-

C:\GSON_WORKSPACE>java GsonTester

出力を確認します。

Student[ name = Mahesh, roll no: 1]
{
   "name": "Mahesh",
   "rollNo": 1
}