Проверить значение существует или нет в объекте JSON, чтобы избежать исключения JSON

Я получаю JSONObject из вызова webservice.

JSONObject result = ...........

Когда я получаю доступ как result.getString("fieldName");

Если fieldName существует в этом JSONObject, тогда он работает нормально. Если этого не существует, я получаю исключение JSONObject["fieldName"] not found.

Я могу использовать try catch для этого. Но у меня есть почти 20 полей, подобных this.Am мне нужно использовать 20 try catch блоков для этого или есть альтернатива для этого. Спасибо заранее...

Ответ 1

Существует метод JSONObject#has(key), предназначенный именно для этой цели. Таким образом, вы можете избежать обработки исключений для каждого поля.

if(result.has("fieldName")){
    // It exists, do your stuff
} else {
    // It doesn't exist, do nothing 
}

Кроме того, вы можете использовать метод JSONObject#isNull(str), чтобы проверить, есть ли он null или нет.

if(result.isNull("fieldName")){
    // It doesn't exist, do nothing
} else {
    // It exists, do your stuff
}

Вы также можете перенести это на метод (для повторного использования кода), где вы передаете JSONObject и String, и метод возвращает, если это поле присутствует или нет.

Ответ 2

Предполагая, что вы используете org.json.JSONObject, вы можете вместо этого использовать JSONObject#optString(String key, String defaultValue). Он вернет defaultValue, если key отсутствует.

Ответ 3

Проверьте, содержит ли ваша реализация JsonObject метод "has has". Это могут быть проверки, если свойство существует в объекте.

Многие реализации JsonObject содержат этот метод.

Ответ 4

Я использую этот код для этого, он возвращает undefined или указанный defaultValue вместо растущего исключения

/* ex: getProperty(myObj,'aze.xyz',0) // return myObj.aze.xyz safely
 * accepts array for property names: 
 *     getProperty(myObj,['aze','xyz'],{value: null}) 
 */
function getProperty(obj, props, defaultValue) {
    var res, isvoid = function(x){return typeof x === "undefined" || x === null;}
    if(!isvoid(obj)){
        if(isvoid(props)) props = [];
        if(typeof props  === "string") props = props.trim().split(".");
        if(props.constructor === Array){
            res = props.length>1 ? getProperty(obj[props.shift()],props,defaultValue) : obj[props[0]];
        }
    }
    return typeof res === "undefined" ? defaultValue: res;
}

Ответ 5

Лучшим решением является использование optString вместо getString.

String name = jsonObject.optString("fieldName");
// it will returns the empty string ("") if the key you specify doesn't exist