Android Json 和空值

Posted

技术标签:

【中文标题】Android Json 和空值【英文标题】:Android Json and null values 【发布时间】:2012-05-22 06:11:39 【问题描述】:

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

【问题讨论】:

你控制 JSON 吗?然后不要发送用户名字段并使用has(java.lang.String);方法 这是一个已知的故意错误:code.google.com/p/android/issues/detail?id=13830 【参考方案1】:

试试json.isNull( "field-name" )

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

【讨论】:

我会更进一步说永远不要使用 has(KEY_NAME),将那些调用替换为 !isNull(KEY_NAME)。 @SkyKelsey:你为什么这么说?这些是具有不同语义的不同事物...... 你是对的。我的意思是大多数时候你使用has(),你真的更喜欢我们!isNull()。大多数情况下,您正在检查指定键处是否存在值,最好使用 !isNull() 来完成。【参考方案2】:

首先检查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)"【参考方案3】:

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

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

【讨论】:

感谢您的回答,但恕我直言,如果密钥不存在则抛出 JSONException,当项目为 null 时返回 null 更符合逻辑 您需要与库本身的开发人员一起讨论风格偏好:p "null" != null。问题是 isNull 需要 api 9+,有时您希望较低的 api 工作。这个答案很好,你可以使用 jsonObject.getString != "null" 来。【参考方案4】:

如果你必须先解析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;                 

【讨论】:

【参考方案5】:

对于 android,如果不存在这样的映射,它将引发 JSONException。所以不能直接调用这个方法。

json.getString("bye")

如果你的数据可以是空的(可能不存在key),试试

json.optString("bye","callback string");

json.optString("bye");

改为。

在您的演示代码中,

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

你得到的是 String "null" not null。

你应该使用

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

【讨论】:

【参考方案6】:

这是我使用的一个辅助方法,这样我只需一行代码就可以获取 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 来避免这样的陷阱。在我看来,它可以更好地处理空值。

【讨论】:

以上是关于Android Json 和空值的主要内容,如果未能解决你的问题,请参考以下文章

改造解析JSON响应空值Android

在android中获取json时控制空值

Android - Jackson JSON 解析器在“发布”版本中返回空值

从android中的firebase函数接收json数据给出空值

无法以某种方式将空值放入 HashMap

如何在 android 中使用 Gson 或 VOLley 从 json 中删除空值