2010-10-29 117 views
0

,我需要使用Android的JSON解析器解析在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":"[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" 
     } 
     ] 
    } 
} 

以下是我使用的第一部分

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,因此如果我尝试使用Felix给解析数组的代码,它将返回一个错误。

所以问题是:检查值是否可以放在JSONArray中的方法是什么。是命令optJSONArray(“possibleArrayValues”)!=空使用或有更好的方法,然后做很多如果然后检查?

回答

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 
} 

未经测试,但应该有效。

+0

不,这不是我的问题... – DArkO 2010-10-29 15:52:10

+0

Flex是正确的......你可以发表一个多个的例子。 – viv 2010-10-29 16:16:13

+0

是的这个作品非常棒!很多。 – DArkO 2010-10-30 02:05:33