2012-03-22 22 views
11

Estoy obteniendo cadena JSON del sitio web. Tengo datos que tiene este aspecto (JSON Array)Cómo comprobar si el objeto dado es objeto o Matriz en cadena JSON

myconf= {URL:[blah,blah]} 

pero algunas veces estos datos se pueden JSON (objeto)

myconf= {URL:{try}} 

también puede estar vacío

myconf= {}  

quiero para hacer diferentes operaciones cuando su objeto y diferente cuando es una matriz. Hasta ahora en mi código que estaba tratando de considerar sólo las matrices lo cual estoy aprendiendo siguiente excepción. Pero no puedo verificar objetos o matrices.

estoy consiguiendo siguiente excepción

org.json.JSONException: JSONObject["URL"] is not a JSONArray. 

¿Puede alguien sugerir cómo puede ser fijo. Aquí sé que los objetos y las matrices son las instancias del objeto JSON. Pero no pude encontrar una función con la que pueda verificar si la instancia dada es una matriz u objeto.

He intentado usar esto si condición, pero sin éxito

if (myconf.length() == 0 ||myconf.has("URL")!=true||myconf.getJSONArray("URL").length()==0) 

Respuesta

23

objetos JSON y matrices son instancias de JSONObject y JSONArray, respectivamente. Agregue a eso el hecho de que JSONObject tiene un método get que le devolverá un objeto, puede verificar el tipo de usted mismo sin preocuparse por ClassCastExceptions, y listo.

if (!json.isNull("URL")) 
{ 
    // Note, not `getJSONArray` or any of that. 
    // This will give us whatever's at "URL", regardless of its type. 
    Object item = json.get("URL"); 

    // `instanceof` tells us whether the object can be cast to a specific type 
    if (item instanceof JSONArray) 
    { 
     // it's an array 
     JSONArray urlArray = (JSONArray) item; 
     // do all kinds of JSONArray'ish things with urlArray 
    } 
    else 
    { 
     // if you know it's either an array or an object, then it's an object 
     JSONObject urlObject = (JSONObject) item; 
     // do objecty stuff with urlObject 
    } 
} 
else 
{ 
    // URL is null/undefined 
    // oh noes 
} 
+0

Gracias. He editado mi pregunta, puede ser que tenga más sentido de lo que estoy pensando. ¿Puedes dar un ejemplo para if (item instanceof JSONArray)? ¿Qué debería poner si la condición? – Judy

+0

Ese * es * el ejemplo. El operador 'instanceof' le dirá si' item' es un 'JSONArray'. Espera, déjame desarrollar un poco. – cHao

+0

Gracias Chao. En realidad funcionó. Pero la cadena también puede estar vacía. Así que estoy recibiendo un error por eso también. if (! myconf.isNull ("URL") || (myconf.getJSONArray ("URL")! = null) || myconf.getJSONArray ("URL"). length()> 0) {Objeto de elemento = myconf.get ("URL"); // other code} Estoy obteniendo la excepción JSONObject ["URL"] no encontrada. – Judy

5

bastantes maneras.

Este es menos recomendable si le preocupan los problemas de recursos del sistema/uso incorrecto del uso de excepciones de Java para determinar una matriz u objeto.

try{ 
// codes to get JSON object 
} catch (JSONException e){ 
// codes to get JSON array 
} 

O

Esto se recomienda.

if (json instanceof Array) { 
    // get JSON array 
} else { 
    // get JSON object 
} 
+0

Gracias, sé cómo eliminar excepciones. Me preocupa comprobar el contenido del objeto y verificar si la URL es una matriz o un objeto. – Judy

+0

Sí, si tocas una excepción tratando de obtener un objeto cuando se trata de una matriz JSON, entonces proporcionas la implementación para obtener una matriz en la cláusula de captura. Esta es una forma, aunque no recomendada. –

+0

En realidad, estoy buscando una función que se pueda usar en las condiciones para el control. – Judy

0

Utilizando la respuesta @Chao puedo resolver mi problema. De otra manera también podemos verificar esto.

Ésta es mi respuesta JSON

{ 
    "message": "Club Details.", 
    "data": { 
    "main": [ 
     { 
     "id": "47", 
     "name": "Pizza", 

     } 
    ], 

    "description": "description not found", 
    "open_timings": "timings not found", 
    "services": [ 
     { 
     "id": "1", 
     "name": "Free Parking", 
     "icon": "http:\/\/hoppyclub.com\/uploads\/services\/ic_free_parking.png" 
     } 
    ] 
    } 
} 

Ahora puede comprobar como este que es el objeto que JSONObject o JSONArray en respuesta.

String response = "above is my reponse"; 

    if (response != null && constant.isJSONValid(response)) 
    { 
     JSONObject jsonObject = new JSONObject(response); 

     JSONObject dataJson = jsonObject.getJSONObject("data"); 

     Object description = dataJson.get("description"); 

     if (description instanceof String) 
     { 
      Log.e(TAG, "Description is JSONObject..........."); 
     } 
     else 
     { 
      Log.e(TAG, "Description is JSONArray..........."); 
     } 
    } 

Esto se utiliza para el cheque que recibió JSON es válida o no

public boolean isJSONValid(String test) { 
     try { 
      new JSONObject(test); 
     } catch (JSONException ex) { 
      // e.g. in case JSONArray is valid as well... 
      try { 
       new JSONArray(test); 
      } catch (JSONException ex1) { 
       return false; 
      } 
     } 
     return true; 
    } 
Cuestiones relacionadas