GsonでJSONデータとJAVAオブジェクトを相互に変換する【Androidアプリ開発】
GsonはGoogleが提供するJavaライブラリで、JSONのパースや生成を容易にするために使用されます。JavaオブジェクトをJSONに、またはJSONをJavaオブジェクトにシームレスに変換できます。この記事ではAndroid Studioのkotlinを使って、Gsonの使い方を解説します。
ライブラリの追加
Module :app の dependencies に、Gsonライブラリを追加します:build.gradle.kts(app)
implementation("com.google.code.gson:gson:2.8.9")
データクラスの用意
扱うJSONデータに沿ったデータクラスを作っておきます:
kotlin
data class User(val name: String, val age: Int)
JAVAオブジェクトをJSONデータに変換する
次は、オブジェクト化されたデータクラスを、JSONの文字列データへ変換する例です:
kotlin
val gson = Gson()
val user = User("John Doe", 30)
val json = gson.toJson(user)
Log.d("mopi", "json: $json")
Logcat出力:
log
json: {"age":30,"name":"John Doe"}
JSONデータをJAVAオブジェクトに変換する
次は、JSONの文字列データをデータクラスのJAVAオブジェクトへ変換する例です:
kotlin
val gson = Gson()
val jsonInput = "{\"name\":\"Mike Doe\",\"age\":4}"
try {
val userFromJson = gson.fromJson(jsonInput, User::class.java)
Log.d("mopi", "User: ${userFromJson.name}, Age: ${userFromJson.age}")
} catch (e: JsonSyntaxException) {
Log.e("mopi", "JSONパースエラー: ${e.message}")
}
Logcat出力:
log
User: Mike Doe, Age: 4
上記のようにエラーハンドリングを実装しておくと、JSONの文字列データが壊れている場合に、 JsonSyntaxException が呼ばれます。ただし、キー名の間違いなどでは JsonSyntaxException は呼ばれずに、値にnullが入ります。
GsonでJSON配列を扱う
次は、Gsonを使用してJSON配列を操作する方法を示すコードです:
kotlin
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
fun main() {
val gson = Gson()
// Userオブジェクトのリストを作成
val users = listOf(User("John Doe", 30), User("Mike Doe", 4))
// リストをJSON配列に変換
val json = gson.toJson(users)
println("JSON配列: $json")
// JSON配列をUserオブジェクトのリストに変換
val userListType = object : TypeToken<List<User>>() {}.type
val usersFromJson = gson.fromJson<List<User>>(json, userListType)
println("オブジェクトリスト:")
usersFromJson.forEach { println("名前: ${it.name}, 年齢: ${it.age}") }
}
Logcat:
log
JSON配列: [{"age":30,"name":"John Doe"},{"age":4,"name":"Mike Doe"}]
名前: John Doe, 年齢: 30
名前: Mike Doe, 年齢: 4
TypeTokenとは
TypeTokenはGoogleのGsonライブラリにおいて、ジェネリックタイプの情報を保持し、処理するために使用されるクラスです。Javaでは型消去により、ジェネリックタイプの情報がランタイム時に失われますが、TypeTokenを使うことで、ジェネリックスの完全な型情報(例えば、List<String>やMap<String, Integer>など)をGsonに提供し、正確なデシリアライズを可能にします。
関連記事
アイデアノート > ネイティブアプリ開発