例如,服务器响应#1具有name
对象:
{
"id":"vfa45f42",
"name": {
"firstName":"UserFirstName",
"lastName":"UserLastName"
}
}
但是有时服务器响应#2具有用户其他对象的name
字符串(这是因为服务器具有MongoDB,而在v1处为String
,而在v2处为Object
):
{
"id":"abfaf453",
"name":"OneSentenceUserName"
}
所以,如果我用响应#2做出此:
val type = object : TypeToken<User>() {}.type
gson.fromJson(responseString, type)
where
data class User(val id:String, val name: Name)
data class Name(val firstName: String, val lastName: String)
错误是:
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line ...
如果是json上的name = null
,我希望将其设为String
不知道它是否可以直接帮助您,但是对于同一情况,我对Kotlinx.Serializartion库执行了以下操作:
将名称设为JsonElement类型
val name: JsonElement
然后创建自定义反序列化函数,如:
fun getName(): Name? =
if (name is JsonObject) {
// deserialize Name normally
} else {
// create Name by hand, only with 'name' property...
}
希望这会有所帮助。