将Moshi PolymorphicJsonAdapterFactory与arrow.core.Option密封类一起使用

时间:2020-01-15 16:09:12

标签: kotlin moshi

当尝试将Moshi多态Json工厂与Moshi arrow.core中定义的Sealed类一起使用时。

val moshi = Moshi.Builder()
    .add(KotlinJsonAdapterFactory())
    .add(
        PolymorphicJsonAdapterFactory.of(arrow.core.Option::class.java, "type")
            .withSubtype(arrow.core.Some::class.java, Some::class.simpleName!!)
            .withSubtype(arrow.core.None::class.java, None::class.simpleName!!)
            .withDefaultValue(None)
    )
    .build()
inline fun <reified T> getAdapter(): JsonAdapter<T> = this.moshi.adapter<T>(T::class.java).serializeNulls()
inline fun <reified T> fromJson(x: String): T = getAdapter<T>().fromJson(x)!!
inline fun <reified T> toJson(item: T): String = getAdapter<T>().toJson(item)

data class OptionTest(val x: Option<String>, val y : Option<Int>)
val obj = OptionTest(None, None)
val serialized = Json.toJson(obj)
val deserialized = Json.fromJson<OptionTest>(serialized)

这将导致以下异常:

Caused by: java.lang.IllegalArgumentException: Cannot reflectively serialize sealed class arrow.core.Option. Please register an adapter.
    at com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory.create(KotlinJsonAdapter.kt:215)
    at com.squareup.moshi.Moshi.adapter(Moshi.java:138)
    ... 52 more

尽管已为Option类型注册了PolymorphicJsonAdapter。

0 个答案:

没有答案