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 ?: ""
})
假设我有一个简单的数据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 ?: ""
})