Как разобрать содержимое ответа HTTP overpassAPI в переменные - PullRequest
0 голосов
/ 15 января 2020

http-запрос к overpassAPI работает, но я попробовал много различных подходов для программной конвертации респона (очень длинной строки) во что-нибудь полезное. пробовал построчно, подстроки и т. д. c во всех видах комбинаций, но все еще не могу найти все, что работает так, как мне нужно:

взять строку ответа, найти первый «элемент» и тип магазина (например, « way 'или' node '), затем создайте переменные (возможно, строковый массив) из имен и значений каждого элемента item (например, [id, lat, lon, timestamp] ... и [000001, 50, 50, 12:00 ,] ... et c), поэтому я могу использовать их в качестве выходных значений для пользователя. Может не всегда быть одинаковое количество элементов в списке для каждого элемента, поэтому я до сих пор не смог использовать различные циклы для достижения этого.

У меня нет предпочтений ни в XML, ни в JSON Формат ответа, так как все, что мне нужно, это значения.

Может кто-нибудь предложить код для достижения этой цели? или, по крайней мере, предложите где-нибудь ответы на которые я ищу? я потратил впустую почти весь день, пытаясь понять это сам и поискать решение проблемы до сих пор большое спасибо

Ответы [ 2 ]

0 голосов
/ 28 января 2020

надеюсь, это спасет кого-то еще от мучительной головной боли, которую это вызвало у меня: решено примерно через 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));
    }
0 голосов
/ 15 января 2020

Я не знаю, какой именно c API, но в целом вам больше никогда не захочется анализировать строку самостоятельно. Выполните поиск в библиотеке для анализа либо json, либо xml, и вы сможете манипулировать ответом для получения указанных вами c данных по вашему выбору.

В основном я использую json, и большинство библиотек позволяют Вы получаете доступ к данным, как к карте ha sh, после ее анализа.

Поскольку они представляют собой множество библиотек, существующих для этой работы, я не хочу рекомендовать их, в частности, поскольку они могут больше не поддерживаться в год или не соответствуют вашим предпочтениям.

...