Gson序列化示例


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

数组示例

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

让我们看看阵列序列化/反序列化的实际应用。在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));     
   }      
}

验证结果

使用 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]

集合示例

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>

让我们看一下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);     
   }      
}

验证结果

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

C:\GSON_WORKSPACE>javac GsonTester.java

现在运行 GsonTester 查看结果 -

C:\GSON_WORKSPACE>java GsonTester

验证输出。

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

泛型示例

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

让我们看一下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);
   }
}

验证结果

使用 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