【Kotlin/Android Studio】GSONの使い方!JSONデータのパースとマッピング

この記事からわかること

  • Android Studio/KotlinライブラリGSON使い方
  • APIで取得できるJSON形式のデータを変換する方法
  • fromJson/toJsonメソッド使い方
  • GsonConverterFactoryHTTPリクエストのレスポンス変換する

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

参考文献:公式リファレンス:GSON

環境

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オブジェクトへ変換してみたいと思います。

流れ

  1. 依存関係の追加
  2. JSONにマッピングするデータクラスの作成
  3. 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が有名です。

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index