0
1

More than 3 years have passed since last update.

JSONパースするのにKotshiを使ってみた

Posted at

何故今回Kotshiを使うのか

KotlinでJsonパースするのにGSONを以外のライブラリを検索してみると
JacksonとMoshiを見つけました。
その上でベンチマークを見るとJackson or Moshiが良さそうでした。
さらにMoshiについて調べているとMoshiよりも早い(らしい?)Kotshiを見つけたため
JackSonと同じぐらいのMoshiよりも早いならより良いだろうとKotshiを使うことにしました。

環境

Android Studio 4.1.1
kotlin 1.4.21
kotshi 2.2.3
moshi 1.9.3

Gradleを使って必要なものを準備

gradle(:app)に以下を追加

plugins {
        (略)
   // 以下追記
   id ‘kotlin-kapt’
}

android {
        (略)
   // 以下追記
   kapt {
       generateStubs = true
   }
}

dependencies{
        (略)
   // 以下追記
  // Moshi
  implementation(“com.squareup.moshi:moshi:1.9.3”)
  implementation(“com.squareup.moshi:moshi-kotlin:1.9.3")

  //Kotshi
  implementation “se.ansman.kotshi:api:2.2.3”
  kapt “se.ansman.kotshi:compiler:2.2.3"
}

上記を追加したらSync Now or File>Sync Projects...をクリック

DataClassの作成

クラスにアノテーション「JsonSerializable」を付ける。
Jsonの項目名と違う変数名を実装するときは
アノテーション「Json( name =“”)」
を付けることで紐つけができる

import se.ansman.kotshi.JsonSerializable

@JsonSerializable
data class HogeData(
    val hoge: Long,
    @Json( name =“fugeId”)
    val fuge: Int
)

KotshiJsonAdapterFactoryを作成

JsonAapterFactory生成クラスを作成

HogeAdapterFactory.kt *名前はなんでも良い

import com.squareup.moshi.JsonAdapter
import se.ansman.kotshi.KotshiJsonAdapterFactory

@KotshiJsonAdapterFactory
abstract class HogeAdapterFactory :JsonAdapter.Factory {
}

上の状態まで記述したら一度ビルドをする

import com.squareup.moshi.JsonAdapter
import se.ansman.kotshi.KotshiJsonAdapterFactory

@KotshiJsonAdapterFactory
abstract class HogeAdapterFactory :JsonAdapter.Factory {
    companion object{
        val INSTNCE : HogeAdapterFactory = KotshiHogeAdapterFactory
    }
}

上記の記述をした状態でビルドが通ればOK

使い方

val builder =Moshi.Builder().add(HogeAdapterFactory.INSTANCE).build()

// not List
val adaper = builder.adapter<HogeData>(dataType)

//Jsonからデータクラスに変換 Strig or JsonReader or BufferedSourceをfromJsonに渡す
val hoge = adapter.fromJson(JSON)

//データからJsonに変換
val Jsonlist = adapter.toJson(HogeData())


// List
val dataType = Types.newParameterizedType(List::class.java,HogeData::class.java)
val adaper = builder.adapter<List<HogeData>>(dataType)

//Jsonからデータクラスに変換 Strig or JsonReader or BufferedSourceをfromJsonに渡す
val hogelist = adapter.fromJson(JSON)

//ListデータからJsonに変換
val Jsonlist = adapter.toJson(ListOf(HogeData(),HogeData()))

*実際に使うときはデータクラスの変数と違う物があると例外が発生するので例外処理を入れる必要がある


引用・参考元

Benchmarking Gson vs Jackson vs Moshi 2020 | Eric Decanini
kotlinでjsonパースはkotshiがいいかも
Kotlinにも対応したJSONライブラリーMoshiの基本的な使い方

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1