Android中的Json和null值

99

如何检测 JSON 值是否为空? 例如:[{"username":null},{"username":"null"}]

第一个情况表示一个不存在的用户名,而第二个则表示名为“null”的用户。但是如果您尝试检索它们,两个值都会导致字符串“null”。

JSONObject json = new JSONObject("{\"hello\":null}");
json.put("bye", JSONObject.NULL);
Log.e("LOG", json.toString());
Log.e("LOG", "hello="+json.getString("hello") + " is null? "
                + (json.getString("hello") == null));
Log.e("LOG", "bye="+json.getString("bye") + " is null? "
                + (json.getString("bye") == null));

日志输出为

{"hello":"null","bye":null}
hello=null is null? false
bye=null is null? false

1
你控制JSON吗?那么不要发送用户名字段并使用has(java.lang.String);方法。 - Blundell
2
这是一个已知的并且是故意制造的错误:http://code.google.com/p/android/issues/detail?id=13830 - Heinzi
6个回答

228

4
我会更进一步地说,永远不要使用 has(KEY_NAME),而是将这些调用替换为!isNull(KEY_NAME)。 - Sky Kelsey
@SkyKelsey:你为什么这么说?这些是具有不同语义的不同事物... - K-ballo
你说得对。我的意思是,大多数情况下,你使用has(),你实际上更愿意使用!isNull()。大多数时候,你正在检查指定键是否存在值,这可以通过!isNull()更好地实现。 - Sky Kelsey

19

由于JSONObject#getString返回给定键存在的值,因此从定义上来说它不是null。这就是JSONObject.NULL存在的原因:表示空的JSON值。

json.getString("hello").equals(JSONObject.NULL); // should be false
json.getString("bye").equals(JSONObject.NULL); // should be true

1
谢谢你的回答,但是我认为,由于在键不存在时抛出JSONException,因此在项目为空时返回null更合乎逻辑。 - Addev
你需要与库的开发者商量风格偏好 :p - FThompson
1
"null" != null。问题在于 isNull 需要 API 9+,有时您希望较低的 API 也能工作。这个答案是可以的,您可以使用 jsonObject.getString != "null"。 - Renato Probst

16

如果没有这样的映射,对于 Android,它将引发一个 JSONException。因此您不能直接调用此方法。

json.getString("bye")

如果您的数据可能为空(键可能不存在),请尝试:

如果您的数据可能为空(可能不存在该键),请尝试:

(更正了一个错别字)
json.optString("bye","callback string");
或者
json.optString("bye");

改为。

在您的演示代码中,

JSONObject json = new JSONObject("{\"hello\":null}");
json.getString("hello");

你得到的是字符串 "null",而不是 null。

你应该使用

if(json.isNull("hello")) {
    helloStr = null;
} else {
    helloStr = json.getString("hello");
}

4

首先用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")


简化为:如果(!resultObject.isNull(“username”)&& resultObject.getString(“username”)。trim()。长度()!= 0) - Sky Kelsey

3
如果你需要先解析 JSON,然后再处理对象,可以尝试以下方法:
解析器:
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;                 
}

2

这是我使用的一个帮助方法,可以让我只用一行代码获取JSON字符串:

public String getJsonString(JSONObject jso, String field) {
    if(jso.isNull(field))
        return null;
    else
        try {
            return jso.getString(field);
        }
        catch(Exception ex) {
            LogHelper.e("model", "Error parsing value");
            return null;
        }
}

然后类似这样:
String mFirstName = getJsonString(jsonObject, "first_name");

会给你提供字符串值或者安全地将字符串变量设为null。我尽可能使用Gson来避免这样的陷阱,因为在我看来它更好地处理了null值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接