Gson 定制型适配器

gson 定制型适配器

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

 

1. 创建自定义适配器

通过扩展 typeadapter 类并将其传递给目标对象的类型来创建自定义适配器。重写 读取 和 写入 方法以分别执行自定义反序列化和序列化。

class studentadapter extends typeadapter<student> {
   @override
   public student read(jsonreader reader) throws ioexception {
      ...
   }
   @override
   public void write(jsonwriter writer, student student) throws ioexception {
   }
}

 

2. 注册自定义适配器

使用gsonbuilder注册自定义适配器和使用创造gson实例 gsonbuilder 。

gsonbuilder builder = new gsonbuilder();
builder.registertypeadapter(student.class, new studentadapter());
gson gson = builder.create();

 

3. 使用适配器

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

1) 范例

让我们看一下自定义类型适配器的实例。在c:> gson_workspace中创建名为 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\":\"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+ "]";
   }
}

2) 验证结果

使用 javac 编译器编译类如下:

c:\gson_workspace>javac gsontester.java

现在运行 gsontester 查看结果:

c:\gson_workspace>java gsontester

验证输出。

student[ name = mahesh, roll no: 1]
{
   "name": "mahesh",
   "rollno": 1
}

下一节:gson null对象支持

gson 教程

相关文章