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 }