Ответ на анализ json может иметь один или несколько объектов - PullRequest
0 голосов
/ 29 октября 2010

Мне нужно проанализировать этот ответ в Android с помощью парсера Android JSON, но я не могу найти ответ где угодно:

как мне проанализировать данные, если, например, «маршруты» могут содержать один или иногда несколько объектов типа «маршрут»? если он содержит один, то возвращается, как это, но если он содержит больше, он возвращается с помощью [] в этом примере «маршрут» не может быть помещен в JsonArray, потому что, очевидно, это не массив. (не помещается в [], верно?)

как мне разобрать это? какие-нибудь примеры?

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

вот что я использую для первой части

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

это пример, который написал Феликс, и он о нескольких «маршрутах»

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

это будет тот же пример, но для одного:

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

поэтому во втором случае JSONArray отсутствует, поэтому, если я попытаюсь использовать код, предоставленный Феликсом для анализа массива, он выдаст ошибку.

поэтому вопрос заключается в следующем: как проверить, можно ли поместить значение в JSONArray. Используется ли команда optJSONArray ("ableArrayValues ​​")! = null или есть лучший метод, чем выполнение множества проверок if-then?

1 Ответ

1 голос
/ 29 октября 2010

Не думаю, что законно иметь несколько ключей с одним и тем же именем в объекте JSON.Т.е. ключи в объекте JSON должны образовывать набор , а не список.

Можете ли вы опубликовать пример, когда есть еще маршруты?Могу поспорить, что это будет выглядеть примерно так:

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

Если это действительно выглядит так, анализировать это просто:

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

Если это не так,API, с которым вы работаете, не работает.Либо исправьте его, либо скажите, кто его запускает, чтобы его исправить:)


Редактировать: Теперь, когда мы знаем, как выглядит ответ из нескольких элементов, вот как его проанализировать:

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
}

Не проверено, но должно работать.

...