kotlinでJSONパーサーにmoshiを使う
kotlinのOptinalはnullになり得るかが一目で分かり
コンパイル時にエラーが出るので素晴らしい。
しかしJSONからオブジェクトを生成する場合
Optinalでないのにnullが入ってしまうケースがある。
JSON-1
{
"lastName" : "太郎"
}
Class
data class User(
val lastName:String
)
val json = //JSON-1と同様のjsonFormat
val user = Gson().fromJson(json,User::class)
val user.firstName.length //ぬるぽが発生
主にAPIの戻り値をパースする時に、
keyの不一致などで起きる事が多いが
これの問題は、プロパティをコールするまで分からない所にあると思う。
そこでmoshiを使ってみよう。
moshiにはパース時にnullチェックをする機能があるので
Keyの不一致や欠損が合ってもオブジェクト生成時にExceptionが投げられて幸せになれる。
導入
module.gradle
dependencies {
compile 'com.squareup.moshi:moshi:1.5.0'
compile "com.squareup.moshi:moshi-kotlin:1.5.0"
}
実装
MoshiTest
class MoshiTest {
data class User(
val lastName: String,
val firstName: String
)
@Test
fun parse() {//KotlinJsonAdapterFactory()を追加する!
val moshi = Moshi
.Builder()
.add(KotlinJsonAdapterFactory())
.build()
//パース先のクラスを指定する
val parser = moshi.adapter(User::class.java)
val correctJson = "{\"lastName\":\"たろう\",\"firstName\":\"やまだ\"}"
assert(parser!!.fromJson(correctJson)!!.lastName == "たろう")
//firstNameが欠損している!
val badJson = "{\"lastName\":\"たろう\"}"
//com.squareup.moshi.JsonDataException: Required value firstName missing at $
val badUser = parser.fromJson(badJson)
assert(badUser!!.lastName.equals("たろう"))
}
}
JsonからObjectを生成した時点で
com.squareup.moshi.JsonDataExceptionが投げられるので異常に気付きやすい
やったね
ちなみに
gsonだと以下のような感じ
@Test
fun withGson() {
val gson = Gson()
val badJson = "{\"lastName\":\"たろう\"}"//java.lang.NullPointerExceptionが発生する
assert(gson.fromJson(badJson, User::class.java).firstName.equals("たろう"))
}
呼び出し時に初めてぬるぽが出る!
技術系のは書くのに時間掛かるなーと思うのであった
所要時間[15+10分]