鍍金池/ 教程/ Java/ Gson自定義類型適配器
Gson開發(fā)環(huán)境設(shè)置
Gson數(shù)據(jù)綁定
Gson序列化內(nèi)部類
Gson數(shù)據(jù)流
Gson簡介
Gson對象數(shù)據(jù)綁定
Gson從序列化中排除字段
Gson版本支持
Gson入門程序
Gson類
Gson自定義類型適配器
Gson對象序列化
Gson空對象支持
Gson教程
Gson樹模型
Gson序列化示例

Gson自定義類型適配器

Gson使用其內(nèi)置適配器執(zhí)行對象的序列化/反序列化。 它也支持自定義適配器。 讓我們來討論如何創(chuàng)建一個(gè)自定義適配器以及如何使用它。

創(chuàng)建自定義適配器

通過擴(kuò)展TypeAdapter類并傳遞目標(biāo)類型的對象來創(chuàng)建自定義適配器。 重寫讀寫方法分別執(zhí)行自定義的反序列化和序列化。

class StudentAdapter extends TypeAdapter<Student> { 
   @Override 
   public Student read(JsonReader reader) throws IOException { 
      ... 
   } 
   @Override 
   public void write(JsonWriter writer, Student student) throws IOException { 
   } 
}

注冊自定義適配器

使用GsonBuilder注冊自定義適配器并使用GsonBuilder創(chuàng)建一個(gè)Gson實(shí)例。參考以下實(shí)現(xiàn)代碼 -

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

使用適配器

Gson現(xiàn)在將使用自定義適配器將Json文本轉(zhuǎn)換為對象,反之亦然。參考以下實(shí)現(xiàn)代碼 -

String jsonString = "{\"name\":\"Maxsu\", \"rollNo\":1}"; 
Student student = gson.fromJson(jsonString, Student.class); 
System.out.println(student);  
jsonString = gson.toJson(student); 
System.out.println(jsonString);

示例

我們來看一個(gè)自定義類型適配器的例子。 創(chuàng)建一個(gè)名為GsonTester的Java類文件: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\":\"Maxsu\", \"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+ "]"; 
   } 
}

執(zhí)行上面示例代碼,得到以下結(jié)果 -

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

上一篇:Gson入門程序