Подтвердить что ты не робот

Как проверить, является ли JSONObject нулевым или не существует

У меня есть набор значений JSONObject которые я получаю от сервера и оперирую. В большинстве случаев я получаю JSONObject со значением (скажем, статистику), а иногда он возвращает объект Error с кодом и описанием ошибки.

Как мне структурировать мой код так, чтобы он не ломался, если он возвращает ошибку. Я думал, что смогу сделать это, но не работает.

public void processResult(JSONObject result) {
    try {
        if(result.getJSONObject(ERROR) != null ){
            JSONObject error = result.getJSONObject(ERROR);
            String error_detail = error.getString(DESCRIPTION);
            if(!error_detail.equals(null)) {
                //show error login here
            }
            finish();
        }
        else {
            JSONObject info = result.getJSONObject(STATISTICS);
            String stats = info.getString("production Stats"));
        }
    }
}
4b9b3361

Ответ 1

Используйте .has(String) и .isNull(String)

Консервативное использование может быть:

    if (record.has("my_object_name") && !record.isNull("my_object_name")) {
        // Do something with object.
      }

Ответ 2

В JSONObject существует метод "Has", который вы можете сделать для определения ключа.

Я не знаю, будет ли это работать, но выглядит надёжно.

public void processResult(JSONObject result) {

    if(result.has("ERROR"))
    {
        JSONObject error = result.getJSONObject("ERROR")
        String error_detail = error.getString("DESCRIPTION");

        if(error_detail != null)
        {
            //Show Error Login
            finish();
        }
    }
    else if(result.has("STATISTICS"))
    {
        JSONObject info = result.getJSONObject("STATISTICS");
        String stats = info.getString("Production Stats");

        //Do something
    }
    else
    {
        throw new Exception("Could not parse JSON Object!");
    }
}

Ответ 3

Это может быть немного поздно (это точно), но опубликовать его для будущих читателей

Вы можете использовать JSONObject optJSONObject (String name) который не будет генерировать никаких исключений и

Возвращает значение, отображаемое по имени, если оно существует и является JSONObject, или ноль в противном случае.

так что вы можете сделать

JSONObject obj = null;
if( (obj = result.optJSONObject("ERROR"))!=null ){
      // it an error , now you can fetch the error object values from obj
}

или если вы просто хотите проверить нулевое значение без извлечения значения, то

if( result.optJSONObject("ERROR")!=null ){
    // error object found 
}

Существует целое семейство функций opt, которые либо возвращают null либо вы также можете использовать перегруженную версию, чтобы они возвращали любые предопределенные значения. например

String optString (String name, String fallback)

Возвращает значение, отображаемое по имени, если оно существует, принудительное его при необходимости или резервное, если такого сопоставления не существует.

где coercing означает, что оно будет пытаться преобразовать значение в тип String


Модифицированная версия ответа @TheMonkeyMan для устранения лишних поисков

public void processResult(JSONObject result) {
    JSONObject obj = null;
    if( (obj = result.optJSONObject("ERROR"))!=null ){
       //^^^^ either assign null or jsonobject to obj
      //  if not null then  found error object  , execute if body                              
        String error_detail = obj.optString("DESCRIPTION","Something went wrong");
        //either show error message from server or default string as "Something went wrong"
        finish(); // kill the current activity 
    }
    else if( (obj = result.optJSONObject("STATISTICS"))!=null ){
        String stats = obj.optString("Production Stats");
        //Do something
    }
    else
    {
        throw new Exception("Could not parse JSON Object!");
    }
}

Ответ 4

Иногда удобнее и менее неоднозначно иметь объект NULL, чем использовать нулевое значение Java.

  • JSONObject.NULL.equals(null) возвращает true.

    JSONObject.NULL.toString() возвращает значение "ноль".

Пример:

System.out.println(test.get( "адрес") равно (нуль).); // Предпочтительный способ System.out.println(test.getString("address"). Equals ("null"));

источник - JSONObject oracle docs