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);метод
Blundell

2
Це відома та навмисна помилка: code.google.com/p/android/issues/detail?id=13830
Heinzi,

Відповіді:


220

Спробуйте json.isNull( "field-name" ).

Посилання: http://developer.android.com/reference/org/json/JSONObject.html#isNull%28java.lang.String%29


4
Я пішов би далі і сказав, щоб НІКОЛИ не використовував has (KEY_NAME), замінюючи ці дзвінки на! IsNull (KEY_NAME).
Sky Kelsey

@SkyKelsey: Чому ти так говориш? Це різні речі з різною семантикою ...
K-ballo

Ти маєш рацію. Я мав на увазі, що більшу частину часу, яке ви використовуєте has (), ви дійсно віддаєте перевагу нам! IsNull (). Більшу частину часу ви перевіряєте, чи існує значення у вказаному ключі, і це краще зробити за допомогою! IsNull ().
Sky Kelsey

17

Оскільки JSONObject # getString повертає значення, якщо даний ключ існує, він не є нульовим за визначенням. Ось чому існує JSONObject.NULL: представляти нульове значення JSON.

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

1
Дякуємо за вашу відповідь, але imho, а оскільки JSONException викидається, якщо ключ не існує, логічніше повертає null, коли елемент є нульовим
Addev

Вам потрібно буде взяти стилістичні уподобання до розробників самої бібліотеки: p
FThompson

1
"null"! = нуль. Проблема в тому, що isNull потрібен api 9+, і іноді ви хочете, щоб працював нижній apis. Ця відповідь гарна, ви можете використовувати jsonObject.getString! = "Null" для.
sagits

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

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, коли тільки можу, щоб уникнути таких підводних каменів. На мою думку, він обробляє нульові значення набагато краще.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.