繁体   English   中英

如何将overpassAPI http响应内容解析为变量

[英]How to parse overpassAPI http response contents into variables

对 overpassAPI 的 Http 查询正在工作,但我尝试了许多不同的方法来以编程方式将响应(非常长的字符串)转换为任何有用的东西。

以各种组合方式逐行尝试,子字符串等,但仍然找不到任何我需要的东西:

获取响应字符串,首先找到“项目”和存储类型(例如“路”或“节点”),然后创建每个项目元素的名称和值的变量(可能是字符串数组列表)(例如 [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));
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM