如何将overpassAPI http响应内容解析成变量
How to parse overpassAPI http response contents into variables
对 overpassAPI 的 Http 查询正在运行,但我已经尝试了许多 种不同的方法来以编程方式将响应(很长的字符串)转换为任何有用的东西。
尝试了逐行、子字符串等各种组合方式,但仍然找不到任何我需要的东西:
获取响应字符串,找到第一个“项目”和存储类型(例如'way'或'node'),然后为每个项目元素的名称和值创建变量(可能是字符串数组列表)
(例如 [id, lat, lon, timestamp]... 和 [000001, 50, 50, 12:00,]... 等)
所以我可以将它们用作用户的输出值。列表中每个项目的项目数量可能并不总是相同,因此到目前为止我一直未能使用各种循环来实现这一点。
我对 XML 或 JSON 响应格式没有偏好,因为我只需要值。
有人可以推荐实现这个的代码吗?或者至少建议某个地方 有我正在寻找的答案?
到目前为止,我已经浪费了将近一整天的时间自己弄清楚并搜索解决方案
非常感谢
我不知道具体的 API 但总的来说你绝不会想自己解析字符串。搜索库以解析 json 或 xml,您将能够操纵答案以检索您选择的特定数据。
我主要使用 json 并且大多数库允许您在解析后像访问哈希映射一样访问数据。
由于该工作现有大量库,我不想特别推荐一个,因为它可能在一年内不再维护或与您的偏好不符。
希望这会让其他人免去这让我头疼的痛苦:
经过大约 7-8 小时的反复试验解决:
public void responseParse(String response) {
try {
//get json object from (whole) response string
JSONObject responseObj = new JSONObject(response);
//pull out jsonArray (of elements) from object
JSONArray responseArr = responseObj.getJSONArray("elements");
Log.d(TAG, "responseParse: Elements: " + responseArr);
//empty previous road list
roadArrList = new ArrayList<>();
//for each element item in json array
for (int i = 0; i < responseArr.length(); i++) {
//convert element to string of contents
String elementStr = responseArr.getString(i);
//create individual element object from (whole) element string
JSONObject elementObj = new JSONObject(elementStr);
//pass element (road) for road data string extraction (and adding to list)
getCardData(elementObj);
}
} catch (Exception e) {
Log.e(TAG, "responseParse: error: json parsing;");
//todo: handle error
e.printStackTrace();
}
//set recyclerView with road cards
buildRecyclerView();
}
元素对象传递给recyclerView构建方法:
public void getCardData(JSONObject elementObj) {
//pull out jsonObject (of tags) from element
try {
JSONObject tagObj = elementObj.getJSONObject("tags");
} catch (JSONException e) {
Log.e(TAG, "getCardData: error creating tag json object");
e.printStackTrace();
}
//assign road name
try {
//for each element, get its required tags and get string of value
roadName = elementObj.getJSONObject("tags").getString("name");
Log.d(TAG, "responseParse: ROADNAME RETRIEVED: " + roadName);
} catch (JSONException e) {
Log.w(TAG, "responseParse: JSON exception occurred: no NAME for road");
roadName = "NO ROAD NAME AVAILABLE";
}
//assign road ID
try {
roadId = elementObj.getString("id");
Log.d(TAG, "responseParse: ID RETRIEVED: " + roadId);
} catch (JSONException e) {
Log.w(TAG, "responseParse: JSON exception occurred: no ID for road");
roadId = "NO ROAD ID AVAILABLE";
}
//assign road limit
try {
roadLimit = elementObj.getJSONObject("tags").getString("maxspeed");
Log.d(TAG, "responseParse: SPEED RETRIEVED: " + roadLimit);
} catch (JSONException e) {
Log.w(TAG, "responseParse: JSON exception occurred: no SPEED for road");
roadLimit = "NO ROAD LIMIT AVAILABLE";
}
//add element (road) values into array (new card)
roadArrList.add(new CardRoad(R.drawable.ic_road, roadName, roadId, roadLimit));
}
对 overpassAPI 的 Http 查询正在运行,但我已经尝试了许多 种不同的方法来以编程方式将响应(很长的字符串)转换为任何有用的东西。
尝试了逐行、子字符串等各种组合方式,但仍然找不到任何我需要的东西:
获取响应字符串,找到第一个“项目”和存储类型(例如'way'或'node'),然后为每个项目元素的名称和值创建变量(可能是字符串数组列表) (例如 [id, lat, lon, timestamp]... 和 [000001, 50, 50, 12:00,]... 等) 所以我可以将它们用作用户的输出值。列表中每个项目的项目数量可能并不总是相同,因此到目前为止我一直未能使用各种循环来实现这一点。
我对 XML 或 JSON 响应格式没有偏好,因为我只需要值。
有人可以推荐实现这个的代码吗?或者至少建议某个地方 有我正在寻找的答案?
到目前为止,我已经浪费了将近一整天的时间自己弄清楚并搜索解决方案
非常感谢
我不知道具体的 API 但总的来说你绝不会想自己解析字符串。搜索库以解析 json 或 xml,您将能够操纵答案以检索您选择的特定数据。
我主要使用 json 并且大多数库允许您在解析后像访问哈希映射一样访问数据。
由于该工作现有大量库,我不想特别推荐一个,因为它可能在一年内不再维护或与您的偏好不符。
希望这会让其他人免去这让我头疼的痛苦: 经过大约 7-8 小时的反复试验解决:
public void responseParse(String response) {
try {
//get json object from (whole) response string
JSONObject responseObj = new JSONObject(response);
//pull out jsonArray (of elements) from object
JSONArray responseArr = responseObj.getJSONArray("elements");
Log.d(TAG, "responseParse: Elements: " + responseArr);
//empty previous road list
roadArrList = new ArrayList<>();
//for each element item in json array
for (int i = 0; i < responseArr.length(); i++) {
//convert element to string of contents
String elementStr = responseArr.getString(i);
//create individual element object from (whole) element string
JSONObject elementObj = new JSONObject(elementStr);
//pass element (road) for road data string extraction (and adding to list)
getCardData(elementObj);
}
} catch (Exception e) {
Log.e(TAG, "responseParse: error: json parsing;");
//todo: handle error
e.printStackTrace();
}
//set recyclerView with road cards
buildRecyclerView();
}
元素对象传递给recyclerView构建方法:
public void getCardData(JSONObject elementObj) {
//pull out jsonObject (of tags) from element
try {
JSONObject tagObj = elementObj.getJSONObject("tags");
} catch (JSONException e) {
Log.e(TAG, "getCardData: error creating tag json object");
e.printStackTrace();
}
//assign road name
try {
//for each element, get its required tags and get string of value
roadName = elementObj.getJSONObject("tags").getString("name");
Log.d(TAG, "responseParse: ROADNAME RETRIEVED: " + roadName);
} catch (JSONException e) {
Log.w(TAG, "responseParse: JSON exception occurred: no NAME for road");
roadName = "NO ROAD NAME AVAILABLE";
}
//assign road ID
try {
roadId = elementObj.getString("id");
Log.d(TAG, "responseParse: ID RETRIEVED: " + roadId);
} catch (JSONException e) {
Log.w(TAG, "responseParse: JSON exception occurred: no ID for road");
roadId = "NO ROAD ID AVAILABLE";
}
//assign road limit
try {
roadLimit = elementObj.getJSONObject("tags").getString("maxspeed");
Log.d(TAG, "responseParse: SPEED RETRIEVED: " + roadLimit);
} catch (JSONException e) {
Log.w(TAG, "responseParse: JSON exception occurred: no SPEED for road");
roadLimit = "NO ROAD LIMIT AVAILABLE";
}
//add element (road) values into array (new card)
roadArrList.add(new CardRoad(R.drawable.ic_road, roadName, roadId, roadLimit));
}