Pregunta

i necesidad de analizar esta respuesta en Android usando el analizador JSON androide, pero la cosa no puedo encontrar la respuesta a cualquier lugar es:

¿Cómo se analizan los datos si, por ejemplo, "itinerarios" pueden contener uno o más objetos a veces del itinerario tipo? si contiene uno de lo que se devuelve como este, pero si contiene más se volvió con [] con este ejemplo "itinerario" no se puede colocar en un JSONArray becouse obviamente no es una matriz. (No se coloca en [] ¿verdad?)

¿Cómo analizo esto? algunos ejemplos?

  {
   "plan":{
      "date":"2010-10-20T00:00:00+02:00",
      "from":{
         "name":"Булевар Партизански Одреди",
         "stopId":"123",
         "lon":"21.373255285035548",
         "lat":"42.00736515785779",
         "geometry":"{\"type\": \"Point\", \"coordinates\": [21.373255285035548,42.00736515785779]}"
      },
      "to":{
         "name":"Булевар Партизански Одреди",
         "stopId":"123",
         "lon":"21.37228809181389",
         "lat":"42.00762790595865",
         "geometry":"{\"type\": \"Point\", \"coordinates\": [21.37228809181389,42.00762790595865]}"
      },
      "itineraries":{
         "itinerary":{
            "duration":"159000",
            "startTime":"2010-10-20T00:00:00+02:00",
            "endTime":"2010-10-20T00:02:39+02:00",
            "walkTime":"159000",
            "transitTime":"0",
            "waitingTime":"0",
            "walkDistance":"212.6496008849819",
            "elevationLost":"0.0",
            "elevationGained":"0.0",
            "transfers":"0",
            "legs":{
               "leg":{
                  "@route":"Булевар Партизански Одреди",
                  "@mode":"WALK",
                  "startTime":"2010-10-20T00:00:00+02:00",
                  "endTime":"2010-10-20T00:02:39+02:00",
                  "distance":"212.6496008849819",
                  "from":{
                     "name":"Булевар Партизански Одреди",
                     "lon":"21.373255285035548",
                     "lat":"42.00736515785779",
                     "geometry":"{\"type\": \"Point\", \"coordinates\": [21.373255285035548,42.00736515785779]}"
                  },
                  "to":{
                     "name":"Булевар Партизански Одреди",
                     "lon":"21.37228809181389",
                     "lat":"42.00762790595865",
                     "geometry":"{\"type\": \"Point\", \"coordinates\": [21.37228809181389,42.00762790595865]}"
                  },
                  "legGeometry":{
                     "length":"3",
                     "points":"_qk_GymmaCf@qC{ArI"
                  },
                  "steps":{
                     "walkSteps":{
                        "distance":"212.6496008849819",
                        "streetName":"Булевар Партизански Одреди",
                        "absoluteDirection":"EAST",
                        "stayOn":"false",
                        "becomes":"false",
                        "lon":"21.373255285035548",
                        "lat":"42.00736515785779",
                        "elevation":""
                     }
                  },
                  "duration":"159000"
               }
            },
            "tooSloped":"false"
         }
      }
   },
   "requestParameters":{
      "entry":[
         {
            "key":"optimize",
            "value":"QUICK"
         },
         {
            "key":"time",
            "value":"9:40 am\""
         },
         {
            "key":"wheelchair",
            "value":"false"
         },
         {
            "key":"maxWalkDistance",
            "value":"800.0"
         },
         {
            "key":"fromPlace",
            "value":"42.0074711701039,21.3732840843651"
         },
         {
            "key":"toPlace",
            "value":"42.0076745404488,21.3723007605583"
         },
         {
            "key":"date",
            "value":"10/20/2010"
         },
         {
            "key":"mode",
            "value":"TraverseMode (WALK, TRAM, SUBWAY, RAIL, BUS, FERRY, CABLE_CAR, GONDOLA, FUNICULAR, TRANSIT, TRAINISH, BUSISH)"
         },
         {
            "key":"numItineraries",
            "value":"3"
         }
      ]
   }
}

Esto es lo que utilizo para la primera parte

JSONObject planObject=json.getJSONObject("plan");
            Log.i("date",planObject.get("date").toString());

            JSONObject fromObject=planObject.getJSONObject("from");
            Log.i("from object",fromObject.get("name").toString());
            Log.i("from object",fromObject.get("stopId").toString());
            Log.i("from object",fromObject.get("lon").toString());
            Log.i("from object",fromObject.get("lat").toString());

Este es el ejemplo Felix escribió y se trata de múltiples "itinerarios"

"itineraries": [
    {"duration": "123456", ... },
    {"duration": "789012", ... }
]

este sería el mismo ejemplo pero por una:

"itineraries": 
{"duration": "123456", ... },

por lo que en el segundo caso no hay JSONArray así que si intento utilizar el código Félix dio para analizar gama devolverá un error.

Así que la pregunta es: ¿cuál es la manera de comprobar si el valor se puede poner en un JSONArray. El comando es optJSONArray ( "possibleArrayValues")! = null utiliza o hay un método mejor para luego hacer un montón de si-entonces cheques?

¿Fue útil?

Solución

No creo que sea legal tener varias claves con el mismo nombre en un objeto JSON. Es decir. las llaves en un objeto JSON deben formar un conjunto , no una lista.

Se puede publicar un ejemplo, cuando hay más itinerarios? Estoy seguro que sería algo como:

...
"itineraries": [
    {"duration": "123456", ... },
    {"duration": "789012", ... }
]
...

Si hace se ve así, el análisis es sencillo:

JSONArray itineraries = planObject.getJSONArray("itineraries");
for (int i=0; i < itineraries.length(); i++) {
    Log.i("TAG", itineraries.getJSONObject(i).getString("duration");
}

Si no lo hace, la API que está trabajando se rompe. De cualquier arreglarlo o decirle a quien lo ejecuta para solucionarlo:)


Editar ahora que sabemos cómo una de varios artículos miradas respuesta como, aquí es cómo analizar que:

Object itineraries = planObject.get("itineraries");
if (itineraries instanceof JSONObject) {
    JSONObject itinerary = (JSONObject) itineraries;
    // right now, itinerary is your single item
}
else {
    JSONArray array = (JSONArray) itineraries;
    // do whatever you want with the array of itineraries
}

No probado, pero debería funcionar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top