【Android】Kotlin Moshi使い方メモ JSONをオブジェクトに変換

はじめに

moshiでjsonをオブジェクトに変換するコードをメモしておく。今回扱いたいのはクラスは以下のようなクラス
・別クラスのListのプロパティがある
・null許容のプロパティがある
・Date型のプロパティがある

swiftでcodableと同じようなことをやりたかった

実装

app/build.gradle

dependencies {
    ・・・
    implementation 'com.squareup.moshi:moshi:1.8.0'
    implementation("com.squareup.moshi:moshi-kotlin:1.8.0")
    implementation 'com.squareup.moshi:moshi-adapters:1.8.0'
}

データクラス

class User(
        val id: Int,
        val name: String,
        val comment: String?,
        val images: List<UserImage>,
        val created: Date
)

class UserImage(val url: String)

MainActivity

package xxx.yyy.zzz

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.squareup.moshi.Moshi
import com.squareup.moshi.Types
import com.squareup.moshi.adapters.Rfc3339DateJsonAdapter
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
import java.lang.reflect.Type
import java.util.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val json = """
            [{
                "id":1,
                "name":"user1",
                "images":[
                    {"url":"http://example.com/path/to/img1"},
                    {"url":"http://example.com/path/to/img2"}
                ],
                "created": "1985-04-12T23:20:50.52Z"
            }, {
                "id":2,
                "name":"user2",
                "images":[
                    {"url":"http://example.com/path/to/img1"},
                    {"url":"http://example.com/path/to/img2"}
                ],
                "created": "1985-04-12T23:20:50.52Z"
            }]
        """.trimIndent()

	val moshi = Moshi.Builder().add(KotlinJsonAdapterFactory()).add(Date::class.java, Rfc3339DateJsonAdapter()).build()
        val type: Type = Types.newParameterizedType(List::class.java, User::class.java)
        val campaigns = moshi.adapter<List<User>>(type).fromJson(json)

        campaigns?.forEach {
            Log.d("", "%d, %s, %s, %s".format(it.id, it.name, it.comment, it.created))
        }
    }
}

以上です