使用不同数量的条目解析嵌套的JSON

时间:2015-08-17 02:25:42

标签: java android json

我正在开发一个公共汽车运输应用程序,我需要进行的一个网络调用获取有关如何从A点到达B点的旅行信息。公共汽车运输API有一个提供此信息的方法。该方法最多返回3个可行的行程,每个行程都有不同数量的腿。还有两种类型的腿,行走腿和骑腿。

我想知道如何解析这些数据然后将其传输到UI。什么让我失望的是,嵌套的条目也有可变长度的嵌套数组(可以是两种类型)。首先检索数据我认为使用ArrayList的ArrayList可以工作。我应该创建两个对应于两种类型的腿的模型,将数据添加到那些,然后将它们动态添加到listView我将用于显示结果吗? (我还需要动态添加行程)。

哦,还有一件事。如果您需要乘坐的公共汽车完成一条路线并开始一条新的路线(当您需要一直保持在它上面时)它会在一条腿上返回多个服务而且我不知道如何有效地检查并传达对用户而言。

以下是其文档https://developer.cumtd.com/documentation/v2.2/method/GetPlannedTripsByStops

的链接

以下是公交网站提供的示例JSON响应

{
   "time":"2012-01-26T13:22:05-06:00",
   "new_changeset": true,
   "status":{
      "code":200,
      "msg":"ok"
   },
   "rqst":{
      "method":"GetPlannedTripsByStops",
      "params":{
         "destination_stop_id":"unipspct",
         "origin_stop_id":"dncncltn"
      }
   },
   "itineraries":[
      {
         "start_time":"2012-01-26T13:41:00-06:00",
         "end_time":"2012-01-26T14:11:00-06:00",
         "travel_time":30,
         "legs":[
            {
               "services":[
                  {
                     "begin":{
                        "lat":40.122199,
                        "lon":-88.295524,
                        "name":"Duncan & Clayton (SE Corner)",
                        "stop_id":"DNCNCLTN:2",
                        "time":"2012-01-26T13:41:00-06:00"
                     },
                     "end":{
                        "lat":40.131976,
                        "lon":-88.288742,
                        "name":"Parkland College",
                        "stop_id":"PKLN:1",
                        "time":"2012-01-26T13:45:00-06:00"
                     },
                     "route":{
                        "route_color":"725700",
                        "route_id":"9A BROWN",
                        "route_long_name":"Brown",
                        "route_short_name":"9A",
                        "route_text_color":"ffffff"
                     },
                     "trip":{
                        "trip_id":"9BA311__BB3",
                        "trip_headsign":"COUNRY FAIR / PARKLAND",
                        "route_id":"9A BROWN",
                        "block_id":"BB3",
                        "direction":"A",
                        "service_id":"BB3",
                        "shape_id":"9A"
                     }
                  },
                  {
                     "begin":{
                        "lat":40.131976,
                        "lon":-88.288742,
                        "name":"Parkland College",
                        "stop_id":"PKLN:1",
                        "time":"2012-01-26T13:58:00-06:00"
                     },
                     "end":{
                        "lat":40.116209,
                        "lon":-88.257355,
                        "name":"University & Prospect (SE Far Side)",
                        "stop_id":"UNIPSPCT:6",
                        "time":"2012-01-26T14:11:00-06:00"
                     },
                     "route":{
                        "route_color":"666666",
                        "route_id":"GREY",
                        "route_long_name":"Grey",
                        "route_short_name":"7",
                        "route_text_color":"ffffff"
                     },
                     "trip":{
                        "trip_id":"3GR763__BB3",
                        "trip_headsign":"EAST - EDGEWOOD",
                        "route_id":"GREY",
                        "block_id":"BB3",
                        "direction":"East",
                        "service_id":"BB3",
                        "shape_id":"7E"
                     }
                  }
               ],
               "type":"Service"
            }
         ]
      }
   ]
}

任何帮助都会受到赞赏我一直在考虑这个问题并且没有取得任何实际进展。

这是我目前所拥有的(目前只有解析代码)。

 final String JSON_ITINERARIES = "itenararies";
            final String JSON_STOP_NAME = "stop_name";
            final String JSON_STOP_LAT = "stop_lat";
            final String JSON_STOP_LONG = "stop_long";
            final String JSON_STOP_ID = "stop_id";


            try {
                JSONArray itinerariesArray;
                JSONObject stopsJson = new JSONObject(JsonStr);




            itinerariesArray = stopsJson.getJSONArray(JSON_ITINERARIES);

            ArrayList itinerariesArrayList = new ArrayList<ArrayList<String>>(itinerariesArray.length());

            for (int i = 0; i < itinerariesArray.length(); i++) {


                JSONObject singleTrip = itinerariesArray.getJSONObject(i);
                JSONArray singleTripLegsJSON = singleTrip.getJSONArray("legs");
                ArrayList legsArrayList = new ArrayList<String>(singleTripLegsJSON.length());

                for (int j=0; j<singleTripLegsJSON.length(); j++) {
                    JSONObject SingleTripObjectSingleLeg = singleTripLegsJSON.getJSONObject(j);
                    String TYPE = SingleTripObjectSingleLeg.getString("type")
                                        //?????   


                }

1 个答案:

答案 0 :(得分:2)

我建议您使用GSON。 GSON是非常非常有用的JSON工具。


首先,使用http://www.jsonschema2pojo.org/从json创建类。

复制&amp;将您的json字符串粘贴到此站点,
选择&#34;源类型:JSON&#34;,
选择&#34;注释风格:GSON&#34;,
按&#34;预览&#34;或者&#34; JAR&#34;获得JAVA课程。

第二,使用GSON解析您的json字符串。访问Here以获取更多示例。

例如:
    私人Gson gson = new Gson();

String sampleData = //
        "[" //
                + "{\"info\": {\"place\": \"place1\"},"
                + "\"events\": {\"info\": \"555f1fc297f229004dd6e8aa\",\"time\": \"5\",\"image\": \"555f1fc2d197270b6c732d3b\",\"event_name\": \"555f1fc224d1cb629a8ef603\"}},"
                + "{\"info\": {\"place\": \"place3\"},"
                + "\"events\": {\"info\": \"555f1fc283c7b150ede89c05\",\"time\": \"7\",\"image\": \"555f1fc2bf5fa8a3b320e0ca\",\"event_name\": \"555f1fc20d40f1b478610505\"}},"
                + "{\"info\": {\"place\": \"place2\"},"
                + "\"events\": {\"info\": \"555f1fc29163e85ae42e7518\",\"time\": \"6\",\"image\": \"555f1fc21506a186c2d34a92\",\"event_name\": \"555f1fc272a06e68b8c3f4b7\"}}" + "  ]";

    java.lang.reflect.Type listType = new TypeToken<List<Event>>() {
    }.getType();
    ArrayList<Event> eventList = gson.fromJson(sampleData, listType);