【Kotlin/Android Studio】GSONの使い方!JSONデータのパースとマッピング
この記事からわかること
- Android Studio/Kotlinのライブラリ:GSONの使い方
- APIで取得できるJSON形式のデータを変換する方法
- fromJson/toJsonメソッドの使い方
- GsonConverterFactoryでHTTPリクエストののレスポンスを変換する
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
参考文献:公式リファレンス:GSON
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
APIで取得できるJSON形式とは?
さまざまなサービスがサービス内の情報を外部のサービスから参照できるようにAPIとして提供してくれています。
※APIとは「Application Programming Interface」の略称でアプリやプログラム、Webサービス同士を繋ぐインターフェースのことを指します。
APIで取得できるのはJSON形式と呼ばれる以下のようなjavascriptのオブジェクトの記法に則った形式になっていることが多いです。
{
"people": [{
"name": "Yoshida Mahiro",
"age": 21,
"hobby": ["読書", "ランニング", "テニス"]
},
{
"name": "Amemiya Tsubaki",
"age": 18,
"hobby": ["旅行", "料理", { "web制作": ["HTML", "CSS", "php"] }]
}
]
}
上記のような簡素なネスト(深さ)なら良いですが、APIによっては複雑でより深いものもあるのでKotlin内での扱いは大変になります。
GSONとは?
GSONとはJSON形式のデータをパースしてKotlin(Java)内で操作しやすい形に変換する機能を提供してくれるライブラリです。JSON→オブジェクトへの変換だけでなく、オブジェクト→JSONへの変換もできるのでAndroidアプリ内でJSONを扱うならかなり便利なライブラリになります。
Androidアプリ内でAPIを取得して利用するのであればRetrofit
を使用することで簡単にHTTP通信を実装することができます。
JSON→Kotlinクラス
今回は簡単なJSON形式で受け取り、実際にGSONを使用してKotlinオブジェクトへ変換してみたいと思います。
流れ
- 依存関係の追加
- JSONにマッピングするデータクラスの作成
- JSONをクラスにマッピングする
依存関係の追加
GSONをAndroid Studio内で使用できるようにするには依存関係を追加する必要があります。build.gradle(Module)
のdependencies{ }
の中に以下を追加します。
implementation 'com.google.code.gson:gson:2.8.6'
JSONにマッピングするデータクラスの作成
GSONがJSONをマッピングするためのデータクラスを作成します。今回のJSONはpeople
というキーを持った辞書形式の中に配列としてPerson
情報を複数保持している形式なのでマッピングするためのデータクラスは以下のようになります。JSONのキー部分を各クラスのプロパティ名に、ネストになっている部分はクラスを分けたりして合わせていきます。
data class Person(
val name: String,
val age: Int,
val hobby: List<Any>
)
data class PeopleData(
val people: List<Person>
)
JSONをクラスにマッピングする
これで準備ができたのでJSONデータを受け取り、クラスに変換していきます。変換するためにはGSON
インスタンスを作成しfromJson
メソッドの引数に、対象のJSON文字列とマッピングしたいクラスを指定するだけです。
val json = """
{
"people": [
{
"name": "Yoshida Mahiro",
"age": 21,
"hobby": ["読書", "ランニング", "テニス"]
},
{
"name": "Amemiya Tsubaki",
"age": 18,
"hobby": ["旅行", "料理", { "web制作": ["HTML", "CSS", "php"] }]
}
]
}
"""
val gson = Gson()
val peopleData = gson.fromJson(json, PeopleData::class.java)
print(peopleData.people.first().name.toString())
// Yoshida Mahiro
JSONのキーとプロパティ名を別にする
JSONのキーをそのままプロパティ名として使用したくない場合は@SerializedName("JSONのキー")
をプロパティに付与します。
data class GroupData(
@SerializedName("people")
val groupA: List<Person>
)
Kotlinクラス→JSON
GSONを使用することでKotlinクラスからJSON文字列に変換することも可能です。そのためにはtoJson
メソッドを使用します。
val peopleData = gson.fromJson(json, PeopleData::class.java)
var jsonStr = gson.toJson(peopleData)
JSONの値を別のデータ型に変換する
例えば値として0
または1
を持つJSONの形式があった場合にこれをKotlin内ではBoolean
として扱いたい場合はTypeAdapter
クラスを用意します。詳細は以下の記事を参考にしてください。
GsonConverterFactoryでHTTPリクエストのレスポンスを変換
GSONにはHTTPリクエストのレスポンスをそのまま変換することができるGsonConverterFactory
クラスが用意されています。先に紹介したRetrofitと組み合わせることで簡単にHTTPリクエストのレスポンスで受け取ったJSONデータをKotlinオブジェクトに変換することができます。
private val retrofit = Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(BASE_URL)
.build()
SwiftならSwiftyJSONが有名です。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。