java.lang.IllegalArgumentException:平台类java.time.LocalDateTime(无注释)需要显式的JsonAdapter

时间:2019-09-17 10:55:08

标签: android kotlin

在以下网址中提及我的问题: 将minsdk更改为26后,在Android 9中使用模拟器 出现以下错误

E/AndroidRuntime: FATAL EXCEPTION: DefaultDispatcher-worker-4
    Process: com.app.homecraft, PID: 28831
    java.lang.IllegalArgumentException: Platform class java.time.LocalDateTime (with no annotations) requires explicit JsonAdapter to be registered
    for class java.time.LocalDateTime birthDay
    for class com.app.homecraft.swagger.client.models.UsersData
        at com.squareup.moshi.Moshi$LookupChain.exceptionWithLookupStack(Moshi.java:348)
        at com.squareup.moshi.Moshi.adapter(Moshi.java:149)
        at com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory.create(KotlinJsonAdapter.kt:241)
        at com.squareup.moshi.Moshi.adapter(Moshi.java:137)
        at com.squareup.moshi.Moshi.adapter(Moshi.java:97)
        at com.squareup.moshi.Moshi.adapter(Moshi.java:71)
        at io.swagger.client.apis.MobileApi.apiMobileUsersGetByFireBaseIDGet(MobileApi.kt:4708)
        at com.app.homecraft.ui.user.Authentication$signIn$1$1.invokeSuspend(Authentication.kt:87)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
        at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:233)
        at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:594)
        at kotlinx.coroutines.scheduling.CoroutineScheduler.access$runSafely(CoroutineScheduler.kt:60)
        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:742)
     Caused by: java.lang.IllegalArgumentException: Platform class java.time.LocalDateTime (with no annotations) requires explicit JsonAdapter to be registered
        at com.squareup.moshi.ClassJsonAdapter$1.create(ClassJsonAdapter.java:60)
        at com.squareup.moshi.Moshi.adapter(Moshi.java:137)
        at com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory.create(KotlinJsonAdapter.kt:241) 
        at com.squareup.moshi.Moshi.adapter(Moshi.java:137) 
        at com.squareup.moshi.Moshi.adapter(Moshi.java:97) 
        at com.squareup.moshi.Moshi.adapter(Moshi.java:71) 
        at io.swagger.client.apis.MobileApi.apiMobileUsersGetByFireBaseIDGet(MobileApi.kt:4708) 
        at com.app.homecraft.ui.user.Authentication$signIn$1$1.invokeSuspend(Authentication.kt:87) 
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) 
        at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:233) 
        at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:594) 
        at kotlinx.coroutines.scheduling.CoroutineScheduler.access$runSafely(CoroutineScheduler.kt:60) 
        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:742) 

在我的模型中,我有一个UsersData类,其中包含一个属性birthDay类型的LocalDateTime,问题是在这里我该如何解决

   data class UsersData (
        val id: kotlin.String? = null,
        val firstName: kotlin.String? = null,
        val lastName: kotlin.String? = null,
        val email: kotlin.String? = null,
        val phone: kotlin.String? = null,
        val image: kotlin.String? = null,
        val birthDay: java.time.LocalDateTime? = null,

    ) 

以下代码是适配器的类:

class LocalDateTimeAdapter : JsonAdapter<LocalDateTime>(){
    override fun toJson(writer: JsonWriter, value: LocalDateTime?) {
        value?.let { writer?.value(it.format(formatter)) }

    }

    override fun fromJson(reader: JsonReader): LocalDateTime? {
        return if (reader.peek() != JsonReader.Token.NULL) {
            fromNonNullString(reader.nextString())
        } else {
            reader.nextNull<Any>()
            null
        }    }
    private val formatter = DateTimeFormatter.ISO_LOCAL_DATE
    private fun fromNonNullString(nextString: String) : LocalDateTime = LocalDateTime.parse(nextString, formatter)

  }

以下代码是Serializer对象:

    import com.squareup.moshi.Moshi
    import com.squareup.moshi.adapters.Rfc3339DateJsonAdapter
    import java.util.*

 object Serializer {
    @JvmStatic
    val moshi: Moshi = Moshi.Builder()
            .add(com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory())
            .add(LocalDateTime::class.java, LocalDateTimeAdapter().nullSafe())
            .build()
}

添加自定义适配器后,新错误如下所示:

java.time.format.DateTimeParseException: Text '2019-09-16T09:00:00Z' could not be parsed, unparsed text found at index 10

1 个答案:

答案 0 :(得分:0)

您要么为Moshi需要一个显式LocalDateTime适配器,要么可以将birthDay更改为Date实例。

编辑:要使用更新的代码解决此问题::

ISO_LOCAL_DATE不支持日期和时间。您需要ISO_LOCAL_DATE_TIME

相关问题