web-dev-qa-db-fra.com

Comment tester si un JSONObject est nul ou n'existe pas

J'ai un ensemble de valeurs JSONObject que je reçois d'un serveur et que j'opère. La plupart du temps, j'obtiens un JSONObject avec une valeur (disons des statistiques) et parfois, il renvoie un objet Error avec un code et une description de l'erreur.

Comment structurer mon code pour qu'il ne se casse pas s'il renvoie l'erreur. Je pensais pouvoir faire ça, mais ça ne marche pas.

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"));
        }
    }
}
25
irobotxxx

Utilisez .has(String) et .isNull(String)

Une utilisation conservatrice pourrait être;

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

Dans JSONObject, il existe une méthode 'Has' que vous pouvez faire pour déterminer la clé.

Je n'ai aucune idée si cela fonctionnera mais cela semble crédible.

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!");
    }
}
9
TheMonkeyMan

Il est peut-être un peu tard (c'est certain) mais le poster pour les futurs lecteurs

Vous pouvez utiliser JSONObject optJSONObject (String name) qui ne lèvera aucune exception et

Renvoie la valeur mappée par nom si elle existe et est un JSONObject, ou null sinon.

pour que vous puissiez faire

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

ou si vous voulez simplement tester la nullité sans récupérer la valeur,

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

Il existe toute une famille de fonctions opt qui renvoient null ou vous pouvez également utiliser la version surchargée pour leur faire retourner toutes les valeurs prédéfinies. par exemple

String optString (String name, String fallback)

Renvoie la valeur mappée par son nom si elle existe, en la contraignant si nécessaire ou en cas de repli si aucun mappage n'existe.

coercing signifie, il essaiera de convertir la valeur en type String


Une version modifiée de la réponse @TheMonkeyMan pour éliminer les recherches redondantes

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!");
    }
}
7
Pavneet_Singh

Il est parfois plus pratique et moins ambigu d'avoir un objet NULL que d'utiliser la valeur nulle de Java.

  • JSONObject.NULL.equals (null) renvoie true.

    JSONObject.NULL.toString () renvoie "null".

Exemple:

System.out.println (test.get ("adresse"). Equals (null)); // Manière préférée System.out.println (test.getString ("adresse"). Equals ("null"));

source - documents Oracle JSONObject

0