Gson-serialization-examples

提供:Dev Guides
移動先:案内検索

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クラスファイルを作成します。

*_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));
   }
}

結果を検証する

次のように 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>

動作中のコレクションのシリアル化/逆シリアル化を見てみましょう。 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);
   }
}

結果を検証する

次のように 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クラスファイルを作成します。

*_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);
   }
}

結果を検証する

次のように 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