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)
归档时间: |
|
查看次数: |
45475 次 |
最近记录: |