2012-05-14 34 views
66

Làm thế nào tôi có thể phát hiện khi một giá trị json là null? ví dụ: [{ "tên người dùng": null}, { "tên người dùng": "null"}]Android Json và null giá trị

Các trường hợp đầu tiên đại diện cho tên người dùng unexisting và một người sử dụng thứ hai có tên là "vô giá trị". Nhưng nếu bạn cố gắng để lấy lại chúng cả hai giá trị dẫn đến chuỗi "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)); 

Các dữ liệu ghi nhận là

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

Bạn có kiểm soát được JSON không? Sau đó, không gửi trường tên người dùng và sử dụng phương thức 'has (java.lang.String);' – Blundell

+0

@Blundell Cảm ơn bạn đã bình luận, nó đã giúp. –

+2

Đây là lỗi * cố ý và có chủ ý: http://code.google.com/p/android/issues/detail?id=13830 – Heinzi

Trả lời

186
+0

Hoàn hảo !!!! Làm việc tốt của nó !!!! – dd619

+4

Tôi sẽ tiếp tục và nói KHÔNG BAO GIỜ sử dụng (KEY_NAME), thay thế các cuộc gọi đó thành! IsNull (KEY_NAME). –

+0

@SkyKelsey: Tại sao bạn lại nói vậy? Đó là những thứ khác nhau với ngữ nghĩa khác nhau ... –

3

kiểm tra đầu tiên với isNull() .... nếu công việc không thể sau đó thử belows

và cũng có thể bạn có JSONObject.NULL để kiểm tra giá trị null ...

if ((resultObject.has("username") 
    && null != resultObject.getString("username") 
    && resultObject.getString("username").trim().length() != 0) 
     { 
       //not null 
     } 

và trong trường hợp của bạn cũng kiểm tra resultObject.getString("username").trim().eqauls("null")

+0

Đơn giản hóa là "if (! ResultObject.isNull (" username ") && resultObject.getString (" username "). Trim(). Length()! = 0)" –

13

Vì JSONObject # getString trả về giá trị nếu t ông cho chìa khóa tồn tại, nó không phải là null theo định nghĩa. Đây là lý do JSONObject.NULL tồn tại: để biểu diễn một giá trị JSON rỗng.

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

Cảm ơn câu trả lời của bạn nhưng imho và vì JSONException bị ném nếu khóa không tồn tại thì sẽ trả về lô-gic hợp lý hơn khi mục là null – Addev

+0

Bạn sẽ cần phải đưa ra các tùy chọn phong cách với các nhà phát triển của chính thư viện: p – Vulcan

+1

"null"! = null. Vấn đề là isNull cần api 9+ và đôi khi bạn muốn apis thấp hơn để làm việc. Câu trả lời này là tốt, bạn có thể sử dụng jsonObject.getString! = "Null". – sagits

3

Nếu bạn phải phân tích json đầu tiên và xử lý các đối tượng sau đó, chúng ta hãy cố gắng này

Parser

Object data = json.get("username"); 

Handler

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;     
} 
12

Đối với android nó sẽ nâng cao một JSONException nếu không có bản đồ như vậy tồn tại. Vì vậy, bạn không thể gọi phương thức này trực tiếp.

json.getString("bye") 

nếu bạn dữ liệu thể để trống (có thể không tồn tại phím), hãy thử

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

hoặc

json.optString("bye"); 

để thay thế.

Trong code demo của bạn,

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

này bạn nhận được là String "null" không null.

bạn shoud sử dụng

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

Dưới đây là một phương pháp helper tôi sử dụng để tôi có thể có được chuỗi JSON với chỉ một dòng mã:

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; 
     } 
} 

và sau đó một cái gì đó như thế này:

String mFirstName = getJsonString(jsonObject, "first_name"); 

sẽ cung cấp cho bạn giá trị chuỗi hoặc đặt biến chuỗi của bạn thành giá trị rỗng một cách an toàn. Tôi sử dụng Gson bất cứ khi nào tôi có thể để tránh những cạm bẫy như thế này. Nó xử lý giá trị null tốt hơn nhiều trong quan điểm của tôi.

Các vấn đề liên quan