JSON jsonObject.optString()返回String"null"

jos*_*usa 57 java android json

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

这是我服务器的json

{
    "street2": null,
    "province": null,
    "street1": null,
    "postalCode": null,
    "country": null,
    "city": null
}
Run Code Online (Sandbox Code Playgroud)

我通过调用String city = address.optString("city", "")我的地址Json-object 获得City的价值.对于这种情况,我希望city是空的(这就是optString的用途不是吗?)但事实上它包含字符串"null".因此,当String包含文本时,进一步的null-或isEmpty-checks将返回false.如果我调用address.isNull("city")它返回true,这是正确的.只是optString失败了.

我在Google或Stackoverflow上找不到任何关于此问题的内容.我真的不明白它是如何发生的,因为我认为optString会完全按照我的预期行事.谁知道这里出了什么问题?

Mat*_*ley 91

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

如果您考虑它,它是有道理的,因为如果在其他Java环境中使用相同库的相同代码在Android中表现不同,则在使用第三方库时会出现主要的兼容性问题.即使意图是好的并且它真正修复了错误,它也会开辟出一整套新的蠕虫.

根据AOSP问题:

这种行为是故意的; 我们竭尽全力与org.json兼容.既然已经修复了,我们还不清楚是否应该修复我们的代码.应用程序可能已经开始依赖这种错误的行为.

如果这让您感到悲伤,我建议您使用不同的机制来测试null,例如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);
}
Run Code Online (Sandbox Code Playgroud)


dev*_*ini 23

你基本上有两个选择:

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

{
"street2": "s2",
"province": "p1",
"street1": null,
"postalCode": null,
"country": null,
"city": null
}
Run Code Online (Sandbox Code Playgroud)

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

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

2)不要发送带有空值的密钥并直接使用optString(key,null)(应该节省带宽).

{
"street2": "s2",
"province": "p1"
}
Run Code Online (Sandbox Code Playgroud)

  • 为json.isNull(key)+1,导致if(json.get(key)== null)无法正常工作 (2认同)
  • 注意:如果找不到密钥,则json.optString(key)将返回一个空字符串。 (2认同)