Java Gson ライブラリ
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 に次のように追加できます:
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.9</version>
</dependency>
Java と JSON オブジェクトを相互変換する簡単な例:
例
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 インスタンスの作成
Java オブジェクトから JSON への変換(シリアライズ)
例
private String name;
private int age;
// コンストラクタ、getter、setter は省略
}
User user = new User("张三", 25);
String json = gson.toJson(user);
// 出力: {"name":"张三","age":25}
JSON から Java オブジェクトへの変換(デシリアライズ)
例
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);
日付の処理
例
.setDateFormat("yyyy-MM-dd HH:mm:ss")
.create();
Date now = new Date();
String dateJson = gson.toJson(now);
Date parsedDate = gson.fromJson(dateJson, Date.class);
ツリーモデルの処理
例
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 は、ネストされたオブジェクト、配列、コレクションなどの複雑なデータ構造を処理できます:
例
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 を使用できます:
例
Type productListType = new TypeToken<List<Product>>(){}.getType();
List<Product> products = gson.fromJson(json, productListType);
カスタムシリアライズとデシリアライズ
JsonSerializer インターフェースと JsonDeserializer インターフェースを実装することで、処理ロジックをカスタマイズできます:
例
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 には便利なアノテーションがいくつか用意されています:
例
@SerializedName("user_name") // JSON フィールド名
private String name;
@Expose(serialize = false) // シリアライズに含めない
private String password;
@Since(1.0) // バージョン管理
private String email;
}
GsonBuilder 設定
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などの他のライブラリです。
その他の拡張