2010-10-29 4 views
0

i besoin d'analyser cette réponse dans Android en utilisant l'analyseur JSON Android, mais la chose que je ne peux pas trouver la réponse partout est:JSON réponse d'analyse syntaxique peut avoir un ou plusieurs objets

Comment puis-je analyser les données si par exemple Les "itinéraires" peuvent contenir un ou parfois plus d'objets du type itinéraire? s'il en contient un que celui-ci est retourné comme ceci mais s'il en contient plus il est retourné avec [] avec cet exemple "itinéraire" ne peut pas être placé dans un JsonArray car ce n'est évidemment pas un tableau. (non placé dans [] droit?)

comment est-ce que j'analyse ceci? des exemples?

{ 
    "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":"[email protected]{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" 
     } 
     ] 
    } 
} 

ici est ce que je l'utilise pour la première partie

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

c'est l'exemple Felix a écrit et il est à propos de plusieurs « itinéraires »

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

ce serait le même exemple mais pour un:

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

donc dans le second cas il n'y a pas de JSONArray donc si j'essaie d'utiliser le code que Felix a donné pour le tableau d'analyse, il retournera une erreur. Donc, la question est: comment vérifier si la valeur peut être mise dans un JSONArray. La commande optJSONArray ("possibleArrayValues")! = null est-elle utilisée ou y a-t-il une meilleure méthode pour faire beaucoup de vérifications if-then?

Répondre

1

Je ne pense pas que ce soit légal d'avoir plusieurs clés avec le même nom dans un objet JSON. C'est à dire. les clés d'un objet JSON doivent former un défini, pas une liste.

Pouvez-vous poster un exemple quand il y a plus d'itinéraires? Je parie que ce devrait ressembler à:

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

Si elle ne ressemble à ça, l'analyse syntaxique, il est facile:

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

Si elle ne le fait pas, l'API vous travaillez avec est cassé. Soit réparer ou dire quel qu'il va le réparer :)


Edit: maintenant que nous savons comment une réponse multiple élément ressemble, voici comment l'analyser:

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 testé, mais cela devrait fonctionner.

+0

non ce n'est pas le cas avec mon problème ... – DArkO

+0

Flex est correct ... Vous pouvez poster un exemple des multiples. – viv

+0

oui celui-ci fonctionne très bien! Merci beaucoup. – DArkO