JSON jsonObject.optString() 返回 String “null”

2022-08-31 13:17:35

我正在开发一个使用JSON进行服务器通信的Android应用程序,当我尝试解析我的json文件时,我遇到了一个奇怪的问题。

这是我从服务器获得的json

{
    "street2": null,
    "province": null,
    "street1": null,
    "postalCode": null,
    "country": null,
    "city": null
}

我通过调用我的地址 Json 对象来获取 City 的值。对于这种情况,我希望是空的(这就是optString在这里的目的,不是吗?),但实际上它包含字符串“null”。因此,进一步的 null 或 isEmpty 检查将返回 false,因为 String 包含文本。如果我称之为返回 true,则返回正确的值。只有失败。String city = address.optString("city", "")cityaddress.isNull("city")optString

我在Google或Stackoverflow上找不到任何问题。我真的不明白它是如何发生的,因为我认为会完全按照我的预期去做。有人知道这里出了什么问题吗?optString


答案 1

你并不是唯一一个遇到这个问题并挠挠头的人,想着“他们真的是这个意思吗?根据AOSP问题,Google工程师确实认为这是一个错误,但他们必须与org.json实现兼容,甚至与错误兼容。

如果你仔细想想,这是有道理的,因为如果在Android环境中运行使用相同库的相同代码的行为不同,那么在使用第三方库时会出现严重的兼容性问题。即使意图是好的,它真正修复了错误,它也会打开一个全新的蠕虫罐。

根据AOSP问题

该行为是故意的;我们竭尽全力与 org.json 兼容 bug。现在已经修复了这个问题,目前还不清楚我们是否应该修复我们的代码。应用程序可能已经依赖于这种错误的行为。

如果这让你感到悲伤,我建议你使用不同的机制来测试空值,例如json.isNull()。

这里有一个简单的方法来帮助你:

/** Return the value mapped by the given key, or {@code null} if not present or null. */
public static String optString(JSONObject json, String key)
{
    // http://code.google.com/p/android/issues/detail?id=13830
    if (json.isNull(key))
        return null;
    else
        return json.optString(key, null);
}

答案 2

你基本上有2个选择:

1) 发送具有空值的 JSON 有效负载

{
"street2": "s2",
"province": "p1",
"street1": null,
"postalCode": null,
"country": null,
"city": null
}

您必须检查空值并相应地解析它们:

private String optString_1(final JSONObject json, final String key) {
    return json.isNull(key) ? null : json.optString(key);
}

2)不要发送空值的键,直接使用optString(键,空)(应该节省带宽)。

{
"street2": "s2",
"province": "p1"
}