Android Json和空值


94

如何检测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);方法
布伦德尔

2
这是一个已知的故意错误:code.google.com/p/android/issues/detail?
id=13830

Answers:


220

4
我会走得更远,说永远不要使用has(KEY_NAME),而将那些调用替换为!isNull(KEY_NAME)。
Sky Kelsey

@SkyKelsey:你为什么这么说?这些是具有不同语义的不同事物……
K-ballo

你是对的。我的意思是,在大多数情况下,您使用has()时,您确实希望我们使用!isNull()。大多数情况下,您要检查指定键处是否存在值,最好使用!isNull()来实现。
Sky Kelsey

17

因为如果给定键存在,则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时返回null
Addev 2012年

您需要与库本身的开发人员一起处理样式偏好:p
FThompson,2012年

1
“ null”!=空。问题是isNull需要api 9+,有时您希望较低的api起作用。这个答案很好,您可以使用jsonObject.getString!=“ null”来。
sagits 2014年

14

对于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")


简化为“ if(!resultObject.isNull(“ username”)&& resultObject.getString(“ username”)。trim()。length()!= 0)“
Sky Kelsey 2013年

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来避免此类陷阱。在我看来,它处理空值要好得多。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.