Domanda

ho bisogno di analizzare la risposta in android con android json parser, ma la cosa che mi riesci a trovare la risposta a qualsiasi punto è:

come faccio ad analizzare i dati se, per esempio, "itinerari" può contenere uno o più oggetti di tipo itinerario?se contiene uno che è tornato come questo, ma se contiene più è tornato con [] con questo esempio di "itinerario" non possono essere collocati in un JsonArray perchè, ovviamente, non è un array.(non posto in [] no?)

come posso analizzare questo?qualche esempio?

  {
   "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"
         }
      ]
   }
}

ecco quello che io uso per la prima 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());

questo è l'esempio Felix ha scritto ed è più "itinerari"

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

questo sarebbe lo stesso esempio, ma per uno:

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

nel secondo caso non c'è JSONArray quindi, se provo ad utilizzare il codice Felix ha dato per l'analisi di array verrà restituito un errore.

quindi la domanda è:qual è il modo per controllare se il valore può essere messo in un JSONArray.è Il comando optJSONArray("possibleArrayValues")!=null utilizzato o c'è un metodo migliore, quindi facendo un sacco di "se-allora" i controlli?

È stato utile?

Soluzione

Io non credo che sia legale per avere più chiavi con lo stesso nome in un oggetto JSON.I. e.le chiavi in un oggetto JSON deve formare un set, non un elenco.

Puoi postare un esempio quando ci sono più itinerari?Scommetto che sarebbe guardare qualcosa come:

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

Se non questo aspetto, l'analisi è semplice:

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

Se non, le API si sta lavorando è di rotto.Correggere o dire chi corre per risolvere il problema :)


Edit: ora che sappiamo come più elemento di risposta sembra, ecco come analizzarlo:

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
}

Non testato, ma dovrebbe funzionare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top