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
Addev
источник
1
Вы контролируете JSON? Тогда не отправляйте поле имени пользователя и используйте has(java.lang.String);метод
Бланделл
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

K-баллон
источник
4
Я бы пошел дальше и сказал НИКОГДА не использовать has (KEY_NAME), заменив эти вызовы на! IsNull (KEY_NAME).
Скай Келси,
@SkyKelsey: Почему ты так говоришь? Это разные вещи с разной семантикой ...
К-балл
Ты прав. Я имел в виду, что большую часть времени, когда вы используете has (), вы действительно предпочитаете нас! IsNull (). В большинстве случаев вы проверяете, существует ли значение для указанного ключа, и это лучше сделать с помощью! IsNull ().
Скай Келси
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, когда элемент равен null
Addev
Вам необходимо
обсудить
1
"ноль"! = ноль. Проблема в том, что isNull требует api 9+, и иногда вам нужно, чтобы работали более низкие api. Ответ хорош, вы можете использовать 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");

это будет String "null", а не null.

ваше использование shoud

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)"
Скай Келси
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;                 
}
thanhbinh84
источник
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, когда могу, чтобы избежать подобных ловушек. На мой взгляд, он намного лучше обрабатывает нулевые значения.

Лу Морда
источник