Java Gson ライブラリ

Java のよく使うクラスライブラリ


Gson は Google が提供する Java ライブラリで、Java オブジェクトを JSON 表現に変換(シリアライズ)し、JSON 文字列を Java オブジェクトに変換(デシリアライズ)するために使用されます。

Gson の主な特徴は次のとおりです:

  • シンプルで使いやすい API
  • Java クラスにアノテーションを追加する必要はありません(ただしアノテーションはサポートされています)
  • 高性能
  • ジェネリック型をサポート
  • カスタムシリアライズとデシリアライズをサポート

コアクラス:

  • Gson:メインクラス。シリアライズ・デシリアライズメソッドを提供します

  • JsonElement:JSON 要素の抽象クラス

  • JsonObject:JSON オブジェクト表現
  • JsonArray:JSON 配列表現


なぜ Gson を使うのか?

Java 開発では、以下のような場面で JSON データを扱うことがよくあります:

  • RESTful API との連携
  • 設定ファイルの読み書き
  • データの永続化
  • 異なるシステム間のデータ交換

Gson はこれらのタスクを完了するためのシンプルで効率的な方法を提供し、Java 標準の JSON 処理方法と比べてより便利です。


Gson の基本用法

Gson 依存関係の追加

まずプロジェクトに Gson の依存関係を追加する必要があります。Maven を使用している場合は、pom.xml に次のように追加できます:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.9</version>
</dependency>

Java と JSON オブジェクトを相互変換する簡単な例:

例

import com.google.gson.Gson;

public class GsonDemo {
    public static void main(String[] args) {
        Gson gson = new Gson();
       
        // JavaオブジェクトをJSONに変換
        Person person = new Person("张三", 30);
        String json = gson.toJson(person);
        System.out.println(json); // 出力: {"name":"张三","age":30}
       
        // JSONをJavaオブジェクトに変換
        Person parsedPerson = gson.fromJson(json, Person.class);
        System.out.println(parsedPerson.getName()); // 出力: 张三
    }
}

class Person {
    private String name;
    private int age;
   
    // コンストラクタ
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
   
    // getterメソッド (Gsonはgetter/setterが必要)
    public String getName() { return name; }
    public int getAge() { return age; }
}

Gson インスタンスの作成

Gson gson = new Gson();

Java オブジェクトから JSON への変換(シリアライズ)

例

class User {
    private String name;
    private int age;
   
    // コンストラクタ、getter、setter は省略
}

User user = new User("张三", 25);
String json = gson.toJson(user);
// 出力: {"name":"张三","age":25}

JSON から Java オブジェクトへの変換(デシリアライズ)

例

String json = "{\"name\":\"李四\",\"age\":30}";
User user = gson.fromJson(json, User.class);
System.out.println(user.getName()); // 出力: 李四

よく使う機能

コレクションの処理

例

// コレクションのシリアライズ
List<Person> people = Arrays.asList(
    new Person("王五", 28),
    new Person("赵六", 32)
);
String jsonList = gson.toJson(people);

// コレクションのデシリアライズ
Type listType = new TypeToken<List<Person>>(){}.getType();
List<Person> parsedPeople = gson.fromJson(jsonList, listType);

日付の処理

例

Gson gson = new GsonBuilder()
    .setDateFormat("yyyy-MM-dd HH:mm:ss")
    .create();

Date now = new Date();
String dateJson = gson.toJson(now);
Date parsedDate = gson.fromJson(dateJson, Date.class);

ツリーモデルの処理

例

String json = "{\"name\":\"李四\",\"age\":25}";
JsonElement element = JsonParser.parseString(json);
JsonObject object = element.getAsJsonObject();
String name = object.get("name").getAsString();
int age = object.get("age").getAsInt();

一般的な設定

出力の整形(プリティプリント)

Gson gson = new GsonBuilder()
    .setPrettyPrinting()
    .create();

null 値の処理

Gson gson = new GsonBuilder()
    .serializeNulls() // 序列化null值
    .create();

フィールド命名戦略

Gson gson = new GsonBuilder()
    .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
    .create();
// 会将userName转换为user_name

Gson の高度な機能

複雑なオブジェクトの処理

Gson は、ネストされたオブジェクト、配列、コレクションなどの複雑なデータ構造を処理できます:

例

class Order {
    private String orderId;
    private List<Product> products;
    // 他のコードは省略
}

Order order = new Order("123", Arrays.asList(
    new Product("手机", 1, 2999.00),
    new Product("耳机", 2, 199.00)
));

String json = gson.toJson(order);

TypeToken を使用したジェネリック型の処理

ジェネリック型のコレクションを扱う必要がある場合は、TypeToken を使用できます:

例

String json = "[{\"name\":\"苹果\",\"price\":5.5},{\"name\":\"香蕉\",\"price\":3.2}]";

Type productListType = new TypeToken<List<Product>>(){}.getType();
List<Product> products = gson.fromJson(json, productListType);

カスタムシリアライズとデシリアライズ

JsonSerializer インターフェースと JsonDeserializer インターフェースを実装することで、処理ロジックをカスタマイズできます:

例

public class DateSerializer implements JsonSerializer<Date> {
    private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
   
    @Override
    public JsonElement serialize(Date date, Type type, JsonSerializationContext context) {
        return new JsonPrimitive(format.format(date));
    }
}

// カスタムシリアライザを使用
Gson gson = new GsonBuilder()
    .registerTypeAdapter(Date.class, new DateSerializer())
    .create();

アノテーションの使用

Gson には便利なアノテーションがいくつか用意されています:

例

class User {
    @SerializedName("user_name")  // JSON フィールド名
    private String name;
   
    @Expose(serialize = false)   // シリアライズに含めない
    private String password;
   
    @Since(1.0)                  // バージョン管理
    private String email;
}

GsonBuilder 設定

GsonBuilder には複数の設定オプションがあります:

例

Gson gson = new GsonBuilder()
    .setPrettyPrinting()         // 出力を整形
    .serializeNulls()           // null 値をシリアライズ
    .setDateFormat("yyyy-MM-dd") // 日付形式
    .disableHtmlEscaping()       // HTML エスケープを無効化
    .create();

パフォーマンスの考慮点

  • Gson インスタンスの再利用:Gson はスレッドセーフであるため、頻繁に作成するのではなく再利用することをお勧めします
  • 大量のデータを処理する場合は、ストリーミング API(JsonReader/JsonWriter)の使用を検討してください
  • 複雑なオブジェクト構造はパフォーマンスに影響を与えます

Gson と他の JSON ライブラリの比較

特徴 Gson Jackson org.json
使いやすさ 高 中 高
パフォーマンス 中 高 低
機能の完全性 高 非常に高い 低
コミュニティサポート 高 非常に高い 中

まとめ

Gson は強力かつシンプルな JSON 処理ライブラリであり、ほとんどの Java プロジェクトに適しています。Gson が提供するもの:

  • シンプルな API 設計
  • 柔軟な設定オプション
  • 良好なパフォーマンス
  • 豊富な機能

シンプルな JSON 処理のニーズには、Gson は通常 Java 開発者の第一選択です。高性能なニーズや複雑なシナリオでは、検討できるのはJacksonなどの他のライブラリです。

Java のよく使うクラスライブラリ

その他の拡張