【问题标题】:How to parse overpassAPI http response contents into variables如何将overpassAPI http响应内容解析为变量
【发布时间】:2020-05-02 11:01:30
【问题描述】:

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

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

获取响应字符串,找到第一个“项目”和存储类型(例如“方式”或“节点”),然后制作每个项目元素的名称和值的变量(可能是字符串数组列表) (例如 [id, lat, lon, timestamp]... 和 [000001, 50, 50, 12:00,]... 等) 所以我可以将它们用作用户的输出值。每个项目的列表中的项目数量可能并不总是相同,因此到目前为止我一直未能使用各种循环来实现这一点。

我对 XML 或 JSON 响应格式没有偏好,因为我只需要值。

有人可以建议代码来实现这一点吗?或者至少建议某个地方有我正在寻找的答案?

到目前为止,我已经浪费了将近一整天的时间试图自己弄清楚并在谷歌上搜索解决方案

非常感谢

【问题讨论】:

    标签: java json xml parsing overpass-api


    【解决方案1】:

    我不知道具体的 API,但总体而言,您通常不想自己解析字符串。搜索库以解析 json 或 xml,您将能够操纵答案以检索您选择的特定数据。

    我主要使用 json,大多数库都允许您在解析后像哈希映射一样访问数据。

    由于它们是为该工作而存在的大量库,因此我不想特别推荐其中一个,因为它可能在一年内不再维护或不符合您的偏好。

    【讨论】:

      【解决方案2】:

      希望这可以避免其他人因这给我带来的痛苦: 经过大约 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));
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-28
        • 2016-06-20
        • 2010-12-01
        • 1970-01-01
        • 2016-09-05
        相关资源
        最近更新 更多