Gson 序列化示例

gson 序列化示例

在本章中,我们将讨论数组,集合和泛型的序列化/反序列化。

 

1. 数组示例

int[] marks = {100,90,85};

//serialization
system.out.println("marks:" + gson.tojson(marks));        

//de-serialization
marks = gson.fromjson("[100,90,85]", int[].class);
system.out.println("marks:" + arrays.tostring(marks));

1) 范例

让我们看看阵列序列化/反序列化的实际应用。在c:> gson_workspace中创建名为 gsontester 的java类文件。

文件:gsontester.java

import java.util.arrays;
import com.google.gson.gson;  

public class gsontester {
   public static void main(string args[]) {
      gson gson = new gson();
      int[] marks = {100,90,85};
      string[] names = {"ram","shyam","mohan"};

      //serialization
      system.out.print("{");
      system.out.print("marks:" + gson.tojson(marks) + ",");       
      system.out.print("names:" + gson.tojson(names));       
      system.out.println("}");  

      //de-serialization
      marks = gson.fromjson("[100,90,85]", int[].class);
      names = gson.fromjson("[\"ram\",\"shyam\",\"mohan\"]", string[].class);
      system.out.println("marks:" + arrays.tostring(marks));
      system.out.println("names:" + arrays.tostring(names));     
   }      
}

2) 验证结果

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

c:\gson_workspace>javac gsontester.java

现在运行gsontester查看结果:

c:\gson_workspace>java gsontester

验证输出。

{marks:[100,90,85],names:["ram","shyam","mohan"]}
marks:[100, 90, 85]
names:[ram, shyam, mohan]

 

2. 集合示例

list marks = new arraylist();

//serialization
system.out.println("marks:" + gson.tojson(marks));        

//de-serialization
//get the type of the collection.
type listtype = new typetoken<list>(){}.gettype();

//pass the type of collection
marks = gson.fromjson("[100,90,85]", listtype);
system.out.println("marks:" +marks);</list>

1) 范例

让我们看一下collection序列化/反序列化的实际应用。在c:> gson_workspace中创建名为 gsontester 的java类文件。

文件:gsontester.java

import java.lang.reflect.type;
import java.util.arraylist;
import java.util.collection;  

import com.google.gson.gson;
import com.google.gson.reflect.typetoken;  

public class gsontester {
   public static void main(string args[]) {
      gson gson = new gson();
      collection<integer> marks = new arraylist<integer>();  
      marks.add(100);
      marks.add(90);
      marks.add(85);  

      //serialization
      system.out.print("{");
      system.out.print("marks:" + gson.tojson(marks));             
      system.out.println("}");  

      //de-serialization
      type listtype = new typetoken<collection<integer>>(){}.gettype();
      marks = gson.fromjson("[100,90,85]", listtype);
      system.out.println("marks:" +marks);     
   }      
}

2) 验证结果

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

c:\gson_workspace>javac gsontester.java

现在运行 gsontester 查看结果 -

c:\gson_workspace>java gsontester

验证输出。

{marks:[100,90,85]}
marks:[100, 90, 85]

 

3. 泛型示例

gson使用java反射api来获取要映射json文本的对象的类型。但是对于泛型,这些信息在序列化过程中会丢失。为了解决这个问题,gson提供了一个 com.google.gson.reflect.typetoken 类来存储通用对象的类型。

1) 范例

让我们看一下generics序列化/反序列化的实际应用。在c:> gson_workspace中创建名为 gsontester 的java类文件。

文件:gsontester.java

import java.lang.reflect.type;

import com.google.gson.gson;
import com.google.gson.reflect.typetoken;  

public class gsontester {
   public static void main(string args[]) {
      // create a shape class of type circle.
      shape<circle> shape = new shape<circle>();  

      // create a circle object
      circle circle = new circle(5.0);  

      //assign circle to shape
      shape.setshape(circle);  
      gson gson = new gson();

      // define a type shapetype of type circle.
      type shapetype = new typetoken<shape<circle>>() {}.gettype();  

      //serialize the json as shapetype
      string jsonstring = gson.tojson(shape, shapetype);
      system.out.println(jsonstring);  
      shape shape1 = gson.fromjson(jsonstring, shape.class);

      system.out.println(shape1.get().getclass());
      system.out.println(shape1.get().tostring());
      system.out.println(shape1.getarea());  
      shape shape2 = gson.fromjson(jsonstring, shapetype);
      system.out.println(shape2.get().getclass());
      system.out.println(shape2.get().tostring());
      system.out.println(shape2.getarea());
   }      
}  
class shape <t> {
   public t shape;  

   public void setshape(t shape) {
      this.shape = shape;
   }  
   public t get() {
      return shape;
   }  
   public double getarea() {
      if(shape instanceof circle) {
         return ((circle) shape).getarea();
      } else {
         return 0.0;
      }
   }
}  
class circle {
   private double radius;  

   public circle(double radius){
      this.radius = radius;
   }  
   public string tostring() {
      return "circle";
   }  
   public double getradius() {
      return radius;
   }  
   public void setradius(double radius) {
      this.radius = radius;
   }  
   public double getarea() {
      return (radius*radius*3.14);
   }
}

2) 验证结果

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

c:\gson_workspace>javac gsontester.java

现在运行 gsontester 查看结果:

c:\gson_workspace>java gsontester

验证输出。

{"shape":{"radius":5.0}}
class com.google.gson.internal.linkedtreemap
{radius = 5.0}
0.0
class circle
circle
78.5

下一节:gson 序列化内部类

gson 教程

相关文章