Gson 简明教程

Gson - Custom Type Adapters

Gson 使用其内置适配器执行对象的序列化/反序列化,它还支持自定义适配器。让我们讨论如何创建自定义适配器以及如何使用它。

Create a Custom Adapter

通过扩展 TypeAdapter 类并向其传入目标对象类型来创建自定义适配器。覆盖 readwrite 方法,分别执行自定义反序列化和序列化。

class StudentAdapter extends TypeAdapter<Student> {
   @Override
   public Student read(JsonReader reader) throws IOException {
      ...
   }

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

Register the Custom Adapter

使用 GsonBuilder 注册自定义适配器,并使用 GsonBuilder 创建 Gson 实例。

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

Use the Adapter

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);

Example

让我们看一个自定义类型适配器的示例。在 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+ "]";
   }
}

Verify the result

使用以下 javac 编译器编译类:

C:\GSON_WORKSPACE>javac GsonTester.java

现在运行 GsonTester 以查看结果 −

C:\GSON_WORKSPACE>java GsonTester

验证输出。

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