【问题标题】:Gson IllegalStateException Expected BEGIN_OBJECT but was STRING when data type is CharSequenceGson IllegalStateException 应为 BEGIN_OBJECT,但当数据类型为 CharSequence 时为 STRING
【发布时间】:2019-09-16 05:37:02
【问题描述】:

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

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()

它按预期工作。但是当我将Carmake的数据类型改为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 类型一起工作,任何建议都表示赞赏。

【问题讨论】:

    标签: java kotlin gson


    【解决方案1】:

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

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

    【讨论】:

    • 它有效,非常感谢快速解决方案。但是为什么在我没有 InstanceCreator 的情况下,错误消息告诉我要尝试 InstanceCreator?很奇怪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 2013-05-15
    • 2015-01-24
    相关资源
    最近更新 更多