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即可。