JSON jsonObject.optString()返回String“null”
我正在开发一个使用JSON进行服务器通信的Android应用程序,当我尝试parsing我的json文件时,出现了一个奇怪的问题。
这是我从服务器的JSON
{ "street2": null, "province": null, "street1": null, "postalCode": null, "country": null, "city": null }
我通过在我的地址Json对象上调用String city = address.optString("city", "")
来获得City的值。 对于这种情况,我期待city
是空的(这是什么optString在这里是不是?),但实际上它包含string“null”。 所以进一步null或isEmpty检查将返回false,因为string包含文本。 如果我打电话给address.isNull("city")
它返回true,这是正确的。 只有optString
失败。
我找不到Google或Stackoverflow上的任何问题。 我真的不明白怎么会发生,因为我认为optString
会做我所期望的。 有人知道这里怎么了?
你并不孤单,遇到这个问题,摸不着头脑,想着“他们真的有这个意思吗? 根据AOSP的问题,Google工程师确实 认为这是一个错误 ,但是他们必须与org.json实现兼容,甚至兼容bug。
如果你仔细想一下,这是有道理的,因为如果使用相同库的代码在其他Java环境中运行的代码在Android中行为不同,那么在使用第三方库时将会出现主要的兼容性问题。 即使意图是好的,它确实修正了一些错误,也会带来一堆全新的蠕虫。
根据AOSP问题 :
行为是故意的; 我们走出了与org.json兼容的方式。 现在这个问题已经解决了,我们是否应该修正我们的代码还不清楚。 应用程序可能已经依赖于这个bug的行为。
如果这导致你的悲伤,我build议你通过使用不同的机制来testingnull,例如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个select:
1)发送一个空值的JSON负载
{ "street2": "s2", "province": "p1", "street1": null, "postalCode": null, "country": null, "city": null }
您将不得不检查空值并相应地parsing它们:
private String optString_1(final JSONObject json, final String key) { return json.isNull(key) ? null : json.optString(key); }
2)不要发送空值的密钥,直接使用optString(key,null)(应该节省带宽)。
{ "street2": "s2", "province": "p1" }
if (json != null && json.getString(KEY_SUCCESS) != null){ // PARSE RESULT }else{ // SHOW NOTIFICIATION: URL/SERVER NOT REACHABLE
}
那就是用json null来检查关键字。
JSONObject json = new JSONObject("{\"hello\":null}"); json.getString("hello");
这个你得到的是string“null”不为空。
你应该使用
if(json.isNull("hello")) { helloStr = null; } else { helloStr = json.getString("hello"); }
首先检查isNull()….如果不能工作,然后尝试下面
还有你有JSONObject.NULL检查空值…
if ((resultObject.has("username") && null != resultObject.getString("username") && resultObject.getString("username").trim().length() != 0) { //not null }
并在你的情况下也检查
resultObject.getString("username").trim().eqauls("null")
如果你必须先parsingjson并稍后处理对象,那就试试这个
分析器
Object data = json.get("username");
处理器
if (data instanceof Integer || data instanceof Double || data instanceof Long) { // handle number ; } else if (data instanceof String) { // hanle string; } else if (data == JSONObject.NULL) { // hanle null; }
如果key的值如下所示为null
{
“状态”:200,
“信息”: ””,
“数据”:{
"totalFare": null,
},
}
检查“isNull”,例如:
String strTotalFare;
if(objResponse.isNull(“totalFare”))
{
strTotalFare =“0”;
} else {
strTotalFare = objResponse.getString(“totalFare”);
}
如果“totalFare”键的值为“null”,则上面的函数将进入if和赋值为零,否则将从键获得实际值。
如果您希望模仿optString的全部function(包括使用Kotlin和Java编写的回退部分),请使用Matt Quigley的答案作为基础。
科特林:
fun optString(json: JSONObject, key: String, fallback: String?): String? { var stringToReturn = fallback if (!json.isNull(key)) { stringToReturn = json.optString(key, null) } return stringToReturn }
Java的:
public static String optString(JSONObject json, String key, String fallback) { String stringToReturn = fallback; if (!json.isNull(key)) { stringToReturn = json.optString(key, null); } return stringToReturn; }
如果不需要回退,只需传递回退参数为null即可。