可以在Gson中使用kotlinx-datetime吗

cgfeq70w  于 2023-08-06  发布在  Kotlin
关注(0)|答案(2)|浏览(102)

我有从本地领域数据库检索的JSON数据。我正在尝试将其转换为相应的数据类。我有一个ISO日期字段

{
  ....
  "createdAt" : "2022-05-04T10:16:56.489Z"
  ....

}

字符串
我想做的是将这个字符串日期字段转换为kotlinx-datetimeInstant对象,它是一个可序列化的类。因此,我将数据类设置为

import kotlinx.datetime.Instant

data class PollPinComment(
    ...
    val createdAt: Instant? = null,
    ...
)


这不起作用,并给出如下错误

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 288 path $[0].createdAt


我确信我可能需要用gson编写一些序列化/反序列化逻辑来将这个字符串转换为Instant对象。所以我的问题是我怎么能做到这一点?先谢了

v8wbuo2f

v8wbuo2f1#

您可以为此创建一个自定义Deserializer,并将其注册为type adapterGson对象。

class InstantDateDeserializer: JsonDeserializer<Instant> {
    override fun deserialize(
        json: JsonElement?, 
        typeOfT: Type?, 
        context: JsonDeserializationContext?
    ): Instant? {
        return json?.asString?.let {
            Instant.parse(it)
        }
    }
}

字符串
创建Gson()对象帕辛deserializer作为type adapter

val gson: Gson = GsonBuilder ()
    .registerTypeAdapter(Instant::class.java, InstantDateDeserializer())
    .create()


如果您使用Retrofit
Retrofit构建器中,将此传递给GsonConverterFactory

val retrofit = Retrofit.Builder()
    .baseUrl(BASE_URL)
    .addConverterFactory(GsonConverterFactory.create(gson))
    .build()

xv8emn3q

xv8emn3q2#

GSON只解析基本数据类型,如Int、String、double...需要解析的其他类也必须由这些基本数据类型组成。可以这样做:

data class PollPinComment(val createdAt: String ){

 fun  getCreatedAt(): Instant{
     return  Instant.parse(createdAt) 
 }
 }

字符串

相关问题