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"));
}
}
}
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.
}
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!");
}
}
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.
où 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!");
}
}
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