我正在从事一个Android项目,并使用Rxandroid,Raterofit进行API调用和检索JSON。JSON看起来像以下内容:
{
"result": [
{
"parent": "jhasj",
"u_deviation": "skasks",
"caused_by": "ksks",
"u_owner_mi": {
"link": "https://gddhdd.service-now.com/api/now/v1/table/sys_user/ghtytu",
"value": "ghtytu"
},
"impact": "",
}
]
}
我正在使用Gson解析JSON。问题是" u_owner_mi"有时在没有分配的值时,有时会重新运行空字符串。我无法将返回类型更改为null。这使我的应用程序崩溃了,因为我期望在这里有一个对象。我会收到以下错误:预期的begin_object,但是字符串
如果您无法修改服务器,请在将其传递给GSON解析器之前替换服务器响应中的违规行。类似:
String safeResponse = serverResponse.replace(""u_owner_mi": """, ""u_owner_mi": null");
您的应用程序(客户端)代码根据您传递给GSON的类中指定的合同期望对象。您的应用程序的行为应有的,并大声崩溃。假设您对此有控制权,则应考虑让服务器返回"u_owner_mi" : null
而不是空字符串。客户端上的u_owner_mi
字段必须是 nullable 类型。
如果您没有修复API的能力,也可以编写一个自定义的Deserializer。
假设您的结果类和子对象为:
data class Result(
val parent: String,
val owner: Any?
)
data class Owner(
val link: String,
val value: String
)
求职者可能是:
class ResultDeserializer : JsonDeserializer<Result> {
override fun deserialize(json: JsonElement, typeOfT: Type?, context: JsonDeserializationContext?): Result {
val jsonObject = json.asJsonObject
val ownerProperty = jsonObject.get("owner")
return Result(
parent = jsonObject.get("parent").asString,
owner = if (ownerProperty.isJsonObject) context?.deserialize<Owner>(ownerProperty.asJsonObject, Owner::class.java)
else ownerProperty.asString
)
}
}
最后,添加Deserializer:
@Test
fun deserialization() {
val gson = GsonBuilder().registerTypeAdapter(Result::class.java, ResultDeserializer()).create()
val result1 = gson.fromJson<Result>(jsonWithObject, Result::class.java)
val result2 = gson.fromJson<Result>(jsonWithEmpty, Result::class.java)
}