web-dev-qa-db-ja.com

Kotlinデータクラスオブジェクトをマップに変換する方法は?

Kotlinデータクラスオブジェクトをプロパティ名でそのプロパティのマップ/辞書に変換する簡単な方法や標準ライブラリメソッドはありますか?反射を回避できますか?

11
Gulshan

私は今日、テストのために同じユースケースを使用しており、最終的にジャクソンオブジェクトマッパーを使用してKotlinデータクラスをマップに変換しました。私の場合、ランタイムのパフォーマンスは大きな問題ではありません。詳細は確認していませんが、ボンネットの下でリフレクションを使用していると思いますが、舞台裏で起こったように懸念はありません。

例えば、

val dataclass = DataClass(p1 = 1, p2 = 2)
val dataclassAsMap = objectMapper.convertValue(dataclass, object: 
TypeReference<Map<String, Any>>() {})

//expect dataclassAsMap == mapOf("p1" to 1, "p2" to 2)
9

私はジャクソン方式を使用していましたが、これのパフォーマンスはAndroid最初のシリアル化( github issue here )でひどいことがわかりました。 Androidバージョン、( ここのベンチマークを参照

ただし、Gsonを使用すると、これをはるかに高速に行うことができます。以下に示す両方向の変換:

val gson = Gson()

//convert a data class to a map
fun <T> T.serializeToMap(): Map<String, Any> {
    return convert()
}

//convert a map to a data class
inline fun <reified T> Map<String, Any>.toDataClass(): T {
    return convert()
}

//convert an object of type I to type O
inline fun <I, reified O> I.convert(): O {
    val json = gson.toJson(this)
    return gson.fromJson(json, object : TypeToken<O>() {}.type)
}
6
ColonelCustard

最も近いのは マップに保存されている委任プロパティ です。

例(リンクから):

class User(val map: Map<String, Any?>) {
    val name: String by map
    val age: Int     by map
}

ただし、これをデータクラスで使用すると、うまく機能しない場合があります。

2
apemanzilla