98

如何检测 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
4

6 回答 6

225

尝试使用json.isNull( "field-name" ).

参考:http: //developer.android.com/reference/org/json/JSONObject.html#isNull%28java.lang.String%29

于 2012-05-14T18:15:53.820 回答
19

因为如果给定键存在,则 JSONObject#getString 返回一个值,因此根据定义它不为空。这就是 JSONObject.NULL 存在的原因:表示一个空 JSON 值。

json.getString("hello").equals(JSONObject.NULL); // should be false
json.getString("bye").equals(JSONObject.NULL); // should be true
于 2012-05-14T18:16:38.907 回答
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");
}
于 2013-03-11T08:36:02.657 回答
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")

于 2012-05-14T18:16:09.913 回答
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;                 
}
于 2013-03-07T10:10:53.417 回答
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");

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

于 2015-07-30T00:46:54.197 回答