如何将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));
    }