web-dev-qa-db-fra.com

la valeur de contrôle existe ou non dans l'objet JSON pour éviter une exception JSON

Je reçois un objet JSON à partir d'un appel de service Web.

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

Quand j'accède comme result.getString("fieldName");

Si la fieldName existe dans ce JSONObject, alors il fonctionne bien. Si ce n'est pas le cas, j'obtiens une exception JSONObject["fieldName"] not found.

Je peux utiliser try catch pour cela.Mais j'ai près de 20 champs comme celui-ci.Am je dois utiliser 20 blocs catch try pour ceci ou y a-t-il une alternative pour cela.Merci à l'avance.

16
PSR

Il existe une méthode JSONObject#has(key) destinée à cet effet. De cette façon, vous pouvez éviter la gestion des exceptions pour chaque champ.

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

En outre, vous pouvez utiliser la méthode JSONObject#isNull(str) pour vérifier si elle est null ou non.

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

Vous pouvez également déplacer cela vers une méthode (pour la réutilisation de code), où vous passez un JSONObject et une chaîne et la méthode retourne si le champ est présent ou non.

34
SudoRahul

En supposant que vous utilisiez org.json.JSONObject , vous pouvez utiliser JSONObject#optString(String key, String defaultValue) à la place. Il retournera defaultValue, si key est absent:

String value = obj.optString(fieldName, defaultValueIfNull);
9
isnot2bad

La meilleure solution consiste à utiliser optString au lieu de getString. 

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

J'utilise ce code pour le faire, il retourne undefined ou une defaultValue spécifiée au lieu d'exception croissante

/* 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;
}
0
Maelkhor

Vérifiez si votre implémentation JsonObject contient une méthode appelée "a". Il pourrait être vérifie si la propriété existe dans l'objet.

De nombreuses implémentations JsonObject contiennent cette méthode.

0
fjtorres