使用Hashmap或GSON的W / O。这是我第一次解析嵌套数组。我知道如何解析单个数组和JSON对象。我已经看过这里的几个线程,并且我的代码基于此:
How to parse this nested JSON array in android
我正在从以下URL解析以下JSON数据(从Postman粘贴)。粘贴在下面的JSON结构。
https://api.tfl.gov.uk/Line/victoria/Route/Sequence/inbound?serviceTypes=Regular,Night
我想按顺序返回16个地铁站的列表;对于所有站,均返回“ id”:940GDCOELW或“ naptanId:940DFDDKLJ09”和“名称”:“ Warren Street Underground Station”。它们存储在“站”(非顺序)和“ stopPointSequences”数组中,也存储在我开始解析“ stopPointSequences”,但是我不确定如何将数据添加到ArrayList中。代码上方指示错误;或者,解析“ orderedLineRoutes”会更容易吗?但是可以解析吗?通过将名称与ID匹配来确定它吗?我不确定数组中是否包含每个“名称”。下面粘贴了“ stopPointSequence”数组的第一部分。谢谢您。
{
"$type": "Tfl.Api.Presentation.Entities.RouteSequence, Tfl.Api.Presentation.Entities",
"lineId": "victoria",
"lineName": "Victoria",
"direction": "inbound",
"isOutboundOnly": false,
"mode": "tube",
"lineStrings":[..];
"stations":[..];
"stopPointSequences":[
{
"$type": "Tfl.Api.Presentation.Entities.StopPointSequence, Tfl.Api.Presentation.Entities",
"lineId": "victoria",
"lineName": "Victoria",
"direction": "inbound",
"branchId": 0,
"nextBranchIds": [],
"prevBranchIds": [],
"stopPoint": [
{
"$type": "Tfl.Api.Presentation.Entities.MatchedStop, Tfl.Api.Presentation.Entities",
"parentId": "HUBWHC",
"stationId": "940GZZLUWWL",
"icsId": "1000249",
"topMostParentId": "HUBWHC",
"modes": [
"tube"
],
"stopType": "NaptanMetroStation",
"zone": "3",
"hasDisruption": true,
"lines": [{..}],
"status": true,
"id": "940GZZLUWWL",
"name": "Walthamstow Central Underground Station",
"lat": 51.582965,
"lon": -0.019885
},
],
"orderedLineRoutes": [
{
"$type": "Tfl.Api.Presentation.Entities.OrderedRoute, Tfl.Api.Presentation.Entities",
"name": "Walthamstow Central ↔ Brixton ",
"naptanIds": [
"940GZZLUWWL",
"940GZZLUBLR",
"940GZZLUTMH",
"940GZZLUSVS",
"940GZZLUFPK",
"940GZZLUHAI",
"940GZZLUKSX",
"940GZZLUEUS",
"940GZZLUWRR",
"940GZZLUOXC",
"940GZZLUGPK",
"940GZZLUVIC",
"940GZZLUPCO",
"940GZZLUVXL",
"940GZZLUSKW",
"940GZZLUBXN"
],
"serviceType": "Night"
},
{
"$type": "Tfl.Api.Presentation.Entities.OrderedRoute, Tfl.Api.Presentation.Entities",
"name": "Walthamstow Central ↔ Brixton ",
"naptanIds": [
"940GZZLUWWL",
"940GZZLUBLR",
"940GZZLUTMH",
"940GZZLUSVS",
"940GZZLUFPK",
"940GZZLUHAI",
"940GZZLUKSX",
"940GZZLUEUS",
"940GZZLUWRR",
"940GZZLUOXC",
"940GZZLUGPK",
"940GZZLUVIC",
"940GZZLUPCO",
"940GZZLUVXL",
"940GZZLUSKW",
"940GZZLUBXN"
],
"serviceType": "Regular" }]
}},
JSONUTILS类:
public static ArrayList<Stations> extractFeatureFromStationJson(String stationJSON) {
// If the JSON string is empty or null, then return early.
if (TextUtils.isEmpty(stationJSON)) {
return null;
}
ArrayList<Stations> stations = new ArrayList<>();
try {
// Create a JSONObject from the JSON response string
JSONObject baseJsonResponse = new JSONObject(stationJSON);
JSONArray stopPointSequenceArrayList = baseJsonResponse.getJSONArray("stopPointSequences");
if (stopPointSequenceArrayList != null) {
for (int i = 0; i < stopPointSequenceArrayList.length(); i++) {
JSONObject elem = stopPointSequenceArrayList.getJSONObject(i);
if (elem != null) {
JSONArray stopPointArrayList = elem.getJSONArray("stopPoint");
if (stopPointArrayList != null) {
for (int j = 0; j < stopPointArrayList.length(); j++) ;
JSONObject innerElem = stopPointArrayList.getJSONObject(i);
if (innerElem != null) {
String idStation = "";
if (innerElem.has("id")) {
idStation = innerElem.optString(KEY_STATION_ID);
}
String nameStation = "";
if (innerElem.has("name")) {
nameStation = innerElem.optString(KEY_STATION_NAME);
}
//Error stopPointSequenceArrayList.add(stopPointArrayList);
}
}
}
}
}
//Error
Stations station = new Stations(idStation, nameStation);
stations.add(station);
} catch (JSONException e) {
// If an error is thrown when executing any of the above statements in the "try" block,
// catch the exception here, so the app doesn't crash. Print a log message
// with the message from the exception.
Log.e("QueryUtils", "Problem parsing stations JSON results", e);
}
// Return the list of stations
return stations;
}
答案 0 :(得分:1)
您的代码中存在几个错误,因此现在应该可以使用。您现在可以提取id
和name
值:
try {
ArrayList<Stations> stations = new ArrayList<>();
// Create a JSONObject from the JSON response string
JSONObject baseJsonResponse = new JSONObject(stationJSON);
JSONArray stopPointSequenceArrayList = baseJsonResponse.getJSONArray("stopPointSequences");
if (stopPointSequenceArrayList != null) {
for (int i = 0; i < stopPointSequenceArrayList.length(); i++) {
JSONObject elem = stopPointSequenceArrayList.getJSONObject(i);
if (elem != null) {
JSONArray stopPointArrayList = elem.getJSONArray("stopPoint");
if (stopPointArrayList != null) {
for (int j = 0; j < stopPointArrayList.length(); j++) {
JSONObject innerElem = stopPointArrayList.getJSONObject(i);
if (innerElem != null) {
String id = innerElem.getString("id");
String name = innerElem.getString("name");
Log.d("Element", name);
Log.d("Element", id);
Stations station = new Stations(id, name);
stations.add(station);
}
}
}
}
}
return stations;
}
return null; //something went wrong
} catch (Exception e) {
// If an error is thrown when executing any of the above statements in the "try" block,
// catch the exception here, so the app doesn't crash. Print a log message
// with the message from the exception.
Log.e("QueryUtils", "Problem parsing stations JSON results", e);
return null; // something went wrong exception is thrown
}