开发手册 欢迎您!
软件开发者资料库

Gson - 自定义类型适配器

Gson自定义类型适配器 - 从简单和简单的步骤学习Gson,从基本到高级概念,包括概述,环境设置,第一个应用程序,Gson类,对象序列化,数据绑定,对象数据绑定,树模型,流API,序列化示例,数组,集合,泛型,序列化内部类,静态嵌套,非静态嵌套类,具有嵌套静态和非静态类的内部类,自定义类型适配器,自定义序列化,反序列化,空对象,版本控制支持,从序列化中排除字段。

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

创建自定义适配器

通过扩展<创建自定义适配器 TypeAdapter 类并将其传递给目标对象的类型.覆盖读取方法分别执行自定义反序列化和序列化.

  StudentAdapter类扩展了TypeAdapter< Student> { @Override  public Student read(JsonReader reader)抛出IOException { ... }  @Override  public void write (JsonWriter作家,学生)抛出IOException {} }


注册自定义适配器

使用GsonBuilder注册自定义适配器和创建使用的 GsonBuilder A GSON实例.

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

使用适配器

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


实例

让我们看一下自定义类型适配器的实例。 在中创建一个名为GsonTester的Java类文件C:\>GSON_WORKSPACE.

文件: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 {    @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+ "]";    } }

验证结果

Compile the classes using javac compiler as follows −

C:\GSON_WORKSPACE>javac GsonTester.java

Now run the GsonTester to see the result −

C:\GSON_WORKSPACE>java GsonTester

验证输出

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