Ответ на анализ json может иметь один или несколько объектов
Мне нужно проанализировать этот ответ в 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("возможный массив): = ноль или есть лучший метод, чем выполнение множества проверок if-then?
1 ответ
Я не думаю, что допустимо иметь несколько ключей с одним и тем же именем в объекте 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
}
Не проверено, но это должно работать.