Android Json và giá trị null


94

Làm cách nào để phát hiện khi giá trị json là null? ví dụ: [{"username": null}, {"username": "null"}]

Trường hợp đầu tiên đại diện cho tên người dùng không tồn tại và trường hợp thứ hai là người dùng có tên "null". Nhưng nếu bạn cố gắng truy xuất chúng thì cả hai giá trị đều 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));

Đầu ra nhật ký là

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

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

2
Đây là một lỗi đã biết và cố ý : code.google.com/p/android/issues/detail?id=13830
Heinzi 21/09/12

Câu trả lời:


220

4
Tôi sẽ đi xa hơn và nói với KHÔNG BAO GIỜ sử dụng has (KEY_NAME), thay thế các cuộc gọi đó tới! IsNull (KEY_NAME).
Sky Kelsey

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

Bạn đúng. Ý tôi là hầu hết thời gian bạn sử dụng đều có (), bạn thực sự thích chúng tôi hơn! IsNull (). Hầu hết thời gian bạn đang kiểm tra xem liệu một giá trị có tồn tại trong khóa được chỉ định hay không và điều đó được thực hiện tốt hơn với! IsNull ().
Sky Kelsey

17

Bởi vì JSONObject # getString trả về một giá trị nếu khóa đã cho 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: đại diện cho 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à từ một JSONException được ném nếu chìa khóa không tồn tại là hợp lý hơn trở về null khi mục là null
Addev

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
FThompson

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

14

Đối với android, nó sẽ tăng một JSONException nếu không có ánh xạ 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 dữ liệu của bạn có thể trống (có thể không tồn tại khóa), hãy thử

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

hoặc là

json.optString("bye");

thay thế.

Trong mã demo của bạn,

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

cái này bạn nhận được là Chuỗi "null" không phải null.

việc sử dụng shoud của bạn

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

4

đầu tiên kiểm tra với isNull().... nếu không thể hoạt động thì hãy thử tin

và bạn cũng phải JSONObject.NULLkiể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")


Được đơn giản hóa thành "if (! ResultObject.isNull (" tên người dùng ") && resultObject.getString (" tên người dùng "). Trim (). Length ()! = 0)"
Sky Kelsey

3

Nếu bạn phải phân tích cú pháp json trước và xử lý đối tượng sau, hãy thử điều này

Trình phân tích cú pháp

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

Người xử lý

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

Đây là một phương pháp trợ giúp tôi sử dụng để tôi có thể nhận các chuỗi JSON chỉ với 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 của bạn hoặc đặt biến chuỗi của bạn thành null một cách an toàn. Tôi sử dụng Gson bất cứ khi nào có thể để tránh những cạm bẫy như thế này. Nó xử lý các giá trị null tốt hơn nhiều theo ý kiến ​​của tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.