すわりんのブログ

androidとかサブカルとかのブログです

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分]