安卓应用崩溃,因为 Json 元素为空字符串 ( " " ) 而不是对象



我正在从事一个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)
    }

最新更新