Frage

Ich brauche diese Antwort in Android analysieren mit dem Android-json-Parser, aber das, was ich die Antwort auf überall finden kann nicht ist:

Wie analysieren wir die Daten, wenn zum Beispiel „Routen“ one enthalten können oder manchmal mehr Objekte vom Typ Route? wenn es enthält ein als es so zurückgegeben wird, aber wenn es mehr enthält es zurückgegeben mit [] Mit diesem Beispiel „Route“ kann nicht in eine JsonArray becouse offensichtlich platziert wird, ist nicht ein Array. (Nicht platziert in [] nicht wahr?)

Wie die i analysieren? irgendwelche Beispiele?

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

Hier ist, was ich für den ersten Teil verwenden

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());

Dies ist das Beispiel Felix geschrieben und es ist über mehrere „Routen“

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

Dies würde das gleiche Beispiel, aber für einen:

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

so im zweiten Fall gibt es keine JSONArray so, wenn ich versuche, den Code zu verwenden, Felix für das Parsen von Array gab wird es einen Fehler zurück.

so die Frage ist: Was ist der Weg zu prüfen, ob der Wert in einem JSONArray gestellt werden. ist der Befehl optJSONArray ( "possibleArrayValues")! = null verwendet oder ist es eine bessere Methode dann viele if-then Kontrollen?

tun
War es hilfreich?

Lösung

Ich glaube nicht, dass es legal , um mehrere Tasten mit dem gleichen Namen in einem JSON-Objekt. D. h die Schlüssel in einem JSON-Objekt sollten einen Satz bilden , keine Liste.

Können Sie ein Beispiel posten, wenn es noch mehr Routen sind? Ich wette, es so aussehen würde wie:

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

Wenn es funktioniert sieht wie folgt aus, es Parsen ist einfach:

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

Wenn dies nicht der Fall, die API Sie arbeiten wird gebrochen. Entweder reparieren sie oder sagen, wer auch immer es läuft, es zu beheben:)


Edit: jetzt, da wir wissen, wie ein Multiple-Item-Response aussieht, ist hier, wie es zu analysieren:

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
}

Nicht getestet, aber es sollte funktionieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top