Gson 简明教程

Gson - Custom Type Adapters

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

Gson performs the serialization/deserialization of objects using its inbuilt adapters. It also supports custom adapters. Let’s discuss how you can create a custom adapter and how you can use it.

Create a Custom Adapter

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

Create a custom adapter by extending the TypeAdapter class and passing it the type of object targeted. Override the read and write methods to do perform custom deserialization and serialization respectively.

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 实例。

Register the custom adapter using GsonBuilder and create a Gson instance using GsonBuilder.

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

Use the Adapter

Gson 现在将使用自定义适配器将 Json 文本转换为对象,反之亦然。

Gson will now use the custom adapter to convert Json text to object and vice versa.

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 类文件。

Let’s see an example of custom type adapter in action. Create a Java class file named GsonTester in C:\>GSON_WORKSPACE.

File − 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 编译器编译类:

Compile the classes using javac compiler as follows −

C:\GSON_WORKSPACE>javac GsonTester.java

现在运行 GsonTester 以查看结果 −

Now run the GsonTester to see the result −

C:\GSON_WORKSPACE>java GsonTester

验证输出。

Verify the output.

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