Ответ 1
Используйте .has(String)
и .isNull(String)
Консервативное использование может быть:
if (record.has("my_object_name") && !record.isNull("my_object_name")) {
// Do something with object.
}
У меня есть набор значений 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"));
}
}
}
Используйте .has(String)
и .isNull(String)
Консервативное использование может быть:
if (record.has("my_object_name") && !record.isNull("my_object_name")) {
// Do something with object.
}
В 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!");
}
}
Это может быть немного поздно (это точно), но опубликовать его для будущих читателей
Вы можете использовать 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!");
}
}
Иногда удобнее и менее неоднозначно иметь объект 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