Gson 简明教程

Gson - Serialization Examples

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

Array Example

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

Example

让我们看看 Array 序列化/反序列化如何发挥作用。在 C:\>GSON_WORKSPACE 中创建一个名为 GsonTester 的 Java 类文件。

File − 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));
   }
}

Verify the result

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

Collections Example

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>

Example

让我们看看 Collection 序列化/反序列化如何发挥作用。在 C:\>GSON_WORKSPACE 中创建一个名为 GsonTester 的 Java 类文件。

File − 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);
   }
}

Verify the result

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

C:\GSON_WORKSPACE>javac GsonTester.java

现在运行 GsonTester 以查看结果 −

C:\GSON_WORKSPACE>java GsonTester

验证输出。

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

Generics Example

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

Example

让我们看看 Generics 序列化/反序列化如何发挥作用。在 C:\>GSON_WORKSPACE 中创建一个名为 GsonTester 的 Java 类文件。

File − 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);
   }
}

Verify the result

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