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 и создайте экземпляр Gson с помощью GsonBuilder .
GsonBuilder builder = new GsonBuilder(); builder.registerTypeAdapter(Student.class, new StudentAdapter()); Gson gson = builder.create();
Используйте адаптер
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);
пример
Давайте посмотрим пример адаптера пользовательского типа в действии. Создайте файл класса Java с именем GsonTester в 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<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+ "]"; } }
Проверьте результат
Скомпилируйте классы, используя компилятор javac следующим образом:
C:\GSON_WORKSPACE>javac GsonTester.java
Теперь запустите GsonTester, чтобы увидеть результат —
C:\GSON_WORKSPACE>java GsonTester
Проверьте вывод.