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

示例

我們來看看數組的序列化/反序列化。 創建一個名為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 = {"Maxsu","zaixian","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("[\"Maxsu\",\"zaixian\",\"Mohan\"]", String[].class);
      System.out.println("marks:" + Arrays.toString(marks));
      System.out.println("names:" + Arrays.toString(names));
   }
}

執行上面示例代碼,得到以下結果 -

{marks:[100,90,85],names:["Maxsu","zaixian","Mohan"]}
marks:[100, 90, 85]
names:[Maxsu, zaixian, 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>

讓我們看看集合(Collection)序列化/反序列化的實際操作。 創建一個名為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);
   }
}

執行上面示例代碼,得到以下結果 -

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

3. 泛型

Gson使用Java反射API來獲取要將Json文本映射到的對象的類型。 但是在泛型中,這些資訊在序列化過程中丟失了。 為了解決這個問題,Gson提供了一個com.google.gson.reflect.TypeToken類來存儲通用對象的類型。

示例

讓我們來看看泛型序列化/反序列化。 創建一個名為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);
   }
}

執行上面示例代碼,得到以下結果 -

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

上一篇: Gson數據流 下一篇: Gson序列化內部類