何故今回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の基本的な使い方