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 和空值的主要内容,如果未能解决你的问题,请参考以下文章
Android - Jackson JSON 解析器在“发布”版本中返回空值