Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
25
Help us understand the problem. What is going on with this article?
@m-coder

「Gson is deprecated.」らしいのでMoshiを試してみる

More than 1 year has passed since last update.

はじめに

今までJSONパーサにGsonを使っていたのですが、あのJakeWharton氏曰く「Gson is deprecated.」との事だったので、Moshiを試してみました。

MoshiはSquare社が開発した軽量なJSONパーサで、Gsonの不満点を解消するために作られたそうです。

軽くGsonとの比較も行います。

導入

build.gradle
apply plugin: 'kotlin-kapt'
...

// Moshi
implementation 'com.squareup.moshi:moshi:1.9.2'
implementation 'com.squareup.moshi:moshi-kotlin:1.9.2'
kapt 'com.squareup.moshi:moshi-kotlin-codegen:1.9.2' // 1.9.Xからこれが無いと "Cannot serialize Kotlin type" エラーが発生する

// Retrofit
implementation "com.squareup.retrofit2:retrofit:2.7.0"
implementation "com.squareup.retrofit2:converter-moshi:2.7.0"

シリアライズ

Gson

data class Repos(
    val id: Int,
    val name: String,
    // 変数名とJSONキーが一致しない場合は@SerializedNameアノテーションを付ける
    @SerializedName("full_name") val fullName: String
)

Moshi

@JsonClass(generateAdapter = true) // Adapter化に必要
data class Repos(
    val id: Int,
    val name: String,
    // 変数名とJSONキーが一致しない場合は@Jsonアノテーションを付ける
    @Json(name = "full_name") val fullName: String
)

fromJSON

Gson

    val jsonString = """
            {
                "id":1,
                "name":"name",
                "full_name":"fullName"
            }
        """.trimIndent()
    val gson = Gson()
    val repos = gson.fromJson(jsonString, Repos::class.java)

Moshi

    val jsonString = """
            {
                "id":1,
                "name":"name",
                "full_name":"fullName"
            }
        """.trimIndent()
    val adapter = Moshi.Builder().build().adapter(Repos::class.java)
    val repos = adapter.fromJson(jsonText)

toJSON

Gson

    val gson = Gson()
    val repos = Repos(1, "name", "fullName")
    val jsonString = gson.toJson(repos)

Moshi

    val adapter = Moshi.Builder().build().adapter(Repos::class.java)
    val repos = Repos(1, "name", "fullName")
    val jsonString = adapter.toJson(repos)

Retrofitとの連携

Gson

    private val gson = GsonBuilder()
        .setLenient()
        .create()
    return Retrofit.Builder()
        .baseUrl("https://api.github.com/")
        .addConverterFactory(GsonConverterFactory.create(gson))
        .build()

Moshi

    private val moshi = Moshi.Builder()
        .add(KotlinJsonAdapterFactory())
        .build()
    return Retrofit.Builder()
        .baseUrl("https://api.github.com/")
        .addConverterFactory(MoshiConverterFactory.create(moshi))
        .build()

パッと見ではGsonの方がコード量が少なく見えますが、Gsonはnon-nullな変数にnullを入れてしまう可能性があるという問題点があるようで、kotlinのnull安全を正しく利用しようとするならMoshiを使った方が安全なようです。

おわりに

今回の記事を書くにあたって以下のリンクを参考にさせて頂きました。
【Qiita】Kotlinと相性が良いMoshiのkotlin extensionを使う
【Qiita】Kotlin JSON (Moshi) 使い方

25
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
m-coder
2018年10月からAndroidを触っています。 Flutterもほんのり。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
25
Help us understand the problem. What is going on with this article?