Gson自定義類型適配器

Gson使用其內置適配器執行對象的序列化/反序列化。 它也支持自定義適配器。 讓我們來討論如何創建一個自定義適配器以及如何使用它。

創建自定義適配器

通過擴展TypeAdapter類並傳遞目標類型的對象來創建自定義適配器。 重寫讀寫方法分別執行自定義的反序列化和序列化。

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\":\"Maxsu\", \"rollNo\":1}";
Student student = gson.fromJson(jsonString, Student.class);
System.out.println(student);
jsonString = gson.toJson(student);
System.out.println(jsonString);

示例

我們來看一個自定義類型適配器的例子。 創建一個名為GsonTester的Java類檔: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\":\"Maxsu\", \"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+ "]";
   }
}

執行上面示例代碼,得到以下結果 -

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

上一篇: Gson序列化內部類 下一篇: Gson空對象支持