2012-04-08 16 views
8

estoy comprobando si un objeto en una cadena JSON existe el uso de este:Verificando existe subobjeto en JSON

JSONObject json = null; 

     try { 
      json = new JSONObject(myJsonString); 
     } catch (JSONException e) { e.printStackTrace(); } 


     if(json.has("myObject")) System.out.println("EXISTS"); 

     else System.out.println("DOESN'T EXIST"); 

El problema aparece cuando intento para comprobar si existe un objeto secundario. por ejemplo:

...,"queue":{"building":{"q0":{"id":177779,... 

cola siempre existe y construcción también, pero q0 no es siempre allí. Entonces, ¿cómo puedo verificar la existencia de q0? Y, ¿hay alguna manera de verificarlo usando la biblioteca Gson?

¡Gracias de antemano!

Respuesta

11

Simplemente puede intentarlo y devolver nulo si la prueba falla. O puede dividir su intento en pequeñas piezas para monitorear dónde falla.

/** 
* This method will return the JSONObject q0, if it exists 
* If it doesn't exist it will return NULL 
* 
*/ 
private JSONObject getQZero(JSONObject json) 
{ 
    try 
    { 
     return json.getJSONObject("queue").getJSONObject("building").getJSONObject("q0"); 
    } 
    catch (JSONException e) 
    { 
     // This could be triggered either because there is no q0 
     // or because the JSON structure is different from what was expected. 
     return null; 
    }  
} 

También puede ir paso a paso, si desea imprimir registros para cada nivel;

/** 
* This method will show where your jsonparsing fails. 
* It will throw a JSONOException if the json is way different from what 
* was expected, and otherwise it will print a log of where the parsing 
* failed. 
*/ 
private JSONObject getQZero(JSONObject json) throws JSONException 
{  
    // Stop if no queue 
    if (! myObject.has("queue") 
    { 
     Log.d(TAG, "no queue!"); 
     return null; 
    } 

    JSONObject queue = myObject.getJSONObject("queue"); 

    // Stop if no building 
    if (! queue.has("building") 
    { 
     Log.d(TAG, "no building!"); 
     return null; 
    } 

    JSONObject building = queue.getJSONObject("building") 

    // Stop if no q0 
    if (! building.has("q0")) 
    { 
     Log.d(TAG, "no q0!"); 
     return null; 
    } 

    JSONObject q0 = building.getJSONObject("q0"); 
    // Q0 is returned here. If the method returned earlier, it returned NULL 
    // You could also do nested ifs, but the indentation gets crazy 
    return q0; 
} 
+2

¡Muchas gracias! –

+1

@KrLx_roller - ¡me alegro de que haya ayudado! –

1

Use las excepciones a su ventaja

try { 
     JSONObject i = json. getJSONObject("q0"); 
     // Is there do something 
    } catch (JSONException e) { 
     // Isn't there 
    } 

http://www.json.org/javadoc/org/json/JSONObject.html#getJSONObject(java.lang.String)

JSONException - si no se encuentra la clave o si el valor no es un JSONObject.

+0

no está funcionando ... Siempre tirar: 'ningún valor para q0' –

+0

Parece que q0 es un JSONObject y no un int. –

+0

@PeterAjtai Sí, es JSONObject que quiero verificar su existencia –

Cuestiones relacionadas