Gson IllegalStateException 预期 BEGIN_OBJECT 但当数据类型为 CharSequence 时为 STRING

Gson IllegalStateException Expected BEGIN_OBJECT but was STRING when data type is CharSequence

假设我有一个简单的数据class

data class Car(var make: String)

和一个Json字符串

val json = "[{'make':'foo'}, {'make':'bar'}]"

当我使用Gson反序列化字符串时

val carList : MutableList<Car> = gson.fromJson(json, Array<Car>::class.java).toMutableList()

它按预期工作。但是当我将 Car 中的 make 的数据类型更改为 CharSequence

data class Car(var make: CharSequence)

并使用 GsonBuilder

val builder = GsonBuilder()
builder.registerTypeAdapter(CharSequence::class.java, object : InstanceCreator<CharSequence> {
    override fun createInstance(type: Type?): CharSequence {
        return String()
    }
})
gson = builder.create()

我得到了com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 11 path $[0].make

一直在努力让它与 CharSequence 类型一起工作,欢迎任何建议。

您必须创建一个合适的JsonDeserializer。不是 InstanceCreator。例如:

builder.registerTypeAdapter(CharSequence::class.java, object : JsonDeserializer<CharSequence> {
    override fun deserialize(
        json: JsonElement?,
        typeOfT: Type?,
        context: JsonDeserializationContext?
    ): CharSequence = json?.asString ?: ""
})