Android应用程序崩溃,因为Json元素是空字符串(“”),而不是对象
我正在从事一个android项目,并使用RxAndroid进行改造,以进行API调用和检索json。json如下所示:Android应用程序崩溃,因为Json元素是空字符串(“”),而不是对象,android,json,gson,Android,Json,Gson,我正在从事一个android项目,并使用RxAndroid进行改造,以进行API调用和检索json。json如下所示: { "result": [ { "parent": "jhasj", "u_deviation": "skasks", "caused_by": "ksks", "u_owner_mi": { "link": "https://
{
"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_对象,但为STRING根据传递给GSON的类中指定的约定,您的应用程序客户端代码应为对象。你的应用程序正常运行,并大声崩溃。您应该考虑让服务器返回UOWORVER STMI:NULL,而不是空字符串,假设您已经控制了它。客户端上的u_owner_mi字段必须是可为空的类型 如果您无法修复api,还可以编写自定义反序列化程序 假设结果类和子对象为:
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
)
}
}
最后,要添加反序列化程序:
@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)
}
如果无法修改服务器,请在将其传递给Gson解析器之前,尝试替换服务器响应中有问题的行。比如:
String safeResponse = serverResponse.replace("\"u_owner_mi\": \"\"", "\"u_owner_mi\": null");
我无法控制服务器。我正在尝试从ServiceNow获取数据。是否有一种方法可以在代码中处理此类响应?是的,您还可以创建自定义反序列化程序。