Android应用程序崩溃,因为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://

我正在从事一个android项目,并使用RxAndroid进行改造,以进行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_对象,但为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获取数据。是否有一种方法可以在代码中处理此类响应?是的,您还可以创建自定义反序列化程序。