Анализ данных JSON, возвращенных из MapQuest в Android

Совершенно новый для Android и использования JSON. Я пытался следовать нескольким предыдущим сообщениям и ответам, но не могу заставить его работать. Мой результат имеет такую ​​форму:

{
    "searchResults": [
        {
            "resultNumber": 1,
            "distance": 1.4849,
            "sourceName": "mqap.internationalpois",
            "name": "Le Restaurant",
            "shapePoints": [
                -37.840523,
                144.991425
            ],
            "distanceUnit": "m",
            "key": "97d091ae-1a7e-48c0-b1ab-ea3a26b2da6c",
            "fields": {
                "cats_ext": "(all) Restaurants::French",
                "phone": "+(33)-(4)-68356262",
                "side_of_street": "N",
                "navsics": "581208",
                "lng": 144.991425,
                "city": "Perpignan",
                "country": "FR",
                "cats": "(all) Restaurants",
                "id": "12500223531687",
                "mqap_geography": {
                    "latLng": {
                        "lng": 144.991425,
                        "lat": -37.840523
                    }
                },
                "navsics_ext": "581208::58120849",
                "address": "16 Cours Lazare Escarguel",
                "postal_code": "66000",
                "name": "Le Restaurant",
                "mqap_id": "97d091ae-1a7e-48c0-b1ab-ea3a26b2da6c",
                "disp_lat": -37.840523,
                "street_link_id": "",
                "lat": -37.840523,
                "disp_lng": 144.991425
            }
        },
        {
            "resultNumber": 2,
            "distance": 11.4161,
            "sourceName": "mqap.internationalpois",
            "name": "Le Val d'Or",
            "shapePoints": [
                -37.881779,
                145.167267
            ],
            "distanceUnit": "m",
            "key": "acf9c655-571e-4129-b70f-2e71f64894c2",
            "fields": {
                "cats_ext": "(all) Restaurants::French",
                "phone": "+(33)-(3)-85451370",
                "side_of_street": "N",
                "navsics": "581208",
                "lng": 145.167267,
                "city": "Mercurey",
                "country": "FR",
                "cats": "(all) Restaurants",
                "id": "12500223506348",
                "mqap_geography": {
                    "latLng": {
                        "lng": 145.167267,
                        "lat": -37.881779
                    }
                },
                "navsics_ext": "581208::58120849",
                "address": "140 Grande Rue",
                "postal_code": "71640",
                "name": "Le Val d'Or",
                "mqap_id": "acf9c655-571e-4129-b70f-2e71f64894c2",
                "disp_lat": -37.881779,
                "street_link_id": "",
                "lat": -37.881779,
                "disp_lng": 145.167267
            }
        },
        {
            "resultNumber": 3,
            "distance": 14.9848,
            "sourceName": "mqap.internationalpois",
            "name": "Le Saint Germain",
            "shapePoints": [
                -37.967893,
                145.179022
            ],
            "distanceUnit": "m",
            "key": "66ad361d-e4c2-4e61-bfc3-dda863d84418",
            "fields": {
                "cats_ext": "(all) Restaurants",
                "phone": "+(33)-(4)-67097575",
                "side_of_street": "N",
                "navsics": "581208",
                "lng": 145.179022,
                "city": "Pézenas",
                "country": "FR",
                "cats": "(all) Restaurants",
                "id": "12500223648887",
                "mqap_geography": {
                    "latLng": {
                        "lng": 145.179022,
                        "lat": -37.967893
                    }
                },
                "navsics_ext": "581208",
                "address": "6 Avenue Paul Vidal de La Blache",
                "postal_code": "34120",
                "name": "Le Saint Germain",
                "mqap_id": "66ad361d-e4c2-4e61-bfc3-dda863d84418",
                "disp_lat": -37.967893,
                "street_link_id": "",
                "lat": -37.967893,
                "disp_lng": 145.179022
            }
        }
    ],
    "origin": {
        "latLng": {
            "lng": 144.970242,
            "lat": -37.827057
        },
        "postalCode": "",
        "adminArea5Type": "City",
        "adminArea4": "",
        "adminArea5": "",
        "adminArea4Type": "County",
        "street": "",
        "adminArea1Type": "Country",
        "adminArea1": "",
        "adminArea3": "",
        "adminArea3Type": "State"
    },
    "resultsCount": 3,
    "hostedData": [
        {
            "tableName": "mqap.internationalpois",
            "extraCriteria": "navsics='581208'",
            "parameters": [
                "581208"
            ],
            "columnNames": []
        }
    ],
    "totalPages": 1,
    "info": {
        "statusCode": 0,
        "copyright": {
            "text": "© 2015 MapQuest, Inc.",
            "imageUrl": "http://api.mqcdn.com/res/mqlogo.gif",
            "imageAltText": "© 2015 MapQuest, Inc."
        },
        "messages": []
    },
    "options": {
        "kmlStyleUrl": "http://www.search.mapquestapi.com/kml-default.kml",
        "shapeFormat": "raw",
        "ambiguities": true,
        "pageSize": 3,
        "radius": 25,
        "currentPage": 1,
        "units": "m",
        "maxMatches": 30
    }
}

Я пытаюсь получить широту и долготу, чтобы показать их на карте. Я попытался создать такие объекты JSON, чтобы получить первую позицию:

JSONObject mainObject = new JSONObject(resmsg);
JSONObject searchResults =  mainObject.getJSONObject("searchResults");
JSONObject mqap_geography = searchResults.getJSONObject("mqap_geography");
JSONObject latLng = mqap_geography.getJSONObject("latLng");
Double lat = Double.parseDouble(latLng.getJSONObject("lat").toString());
Double lon = Double.parseDouble(latLng.getJSONObject("lng").toString());

Любая помощь..


person user5338274    schedule 15.09.2015    source источник
comment
Вы говорите, что не можете заставить его работать, что это значит? Есть ли ошибка? Возвращаемые значения неверны? Будьте точны, иначе мы не сможем вам помочь.   -  person WannaGetHigh    schedule 15.09.2015
comment
Любая помощь.. да, изучите основы... searchResults - это массив, используйте правильный метод JSONObject.getXXXXX(), чтобы получить массив, а затем повторите его... что касается double, у вас также есть правильный метод JSONObject.getXXXXX() для этого... здесь, на SO, есть множество вопросов о разборе json в java... если вы не можете учиться на примерах и вам нужен прямой код для вашего конкретного JSON, вам следует подумать о прекращении программирования   -  person Selvin    schedule 15.09.2015


Ответы (3)


Используйте Гсона. Вам не нужно заново изобретать шины для вашего только что изобретенного колеса.

Посмотрите, как они это делают, здесь https://github.com/lissyfeja/MapQuest/blob/master/src/de/bht/mmi/ema/EditEventActivity.java

По сути, вы создаете объект со структурой, полученной из JSON, затем вы говорите Gson проанализировать вашу строку в этой структуре объекта.

mEvent = new Gson().fromJson(json, MQCalendarEvent.class);

Вот еще один хороший пример, который просто анализирует данные с помощью парсера по умолчанию, а затем получает их с помощью некоторых простых методов, которые предоставляет Gson: Android — Анализ JSON с помощью GSON

person Messer    schedule 15.09.2015

Разве результат поиска не является JSONArray? Ваш код JSON немного сложно читать

JSONObject mainObject = new JSONObject(resmsg);
JSONArray searchResults =  mainObject.getJSONArray("searchResults");
 ...
 --> Iterate over searchResults to get the JSONObject you need e.g.mqap_geography
....
JSONObject latLng = mqap_geography.getJSONObject("latLng");
Double lat = Double.parseDouble(latLng.getJSONObject("lat").toString());
Double lon = Double.parseDouble(latLng.getJSONObject("lng").toString());

@Edit, конечно, нет метода .getJSONObject из JSONArray. Моя ошибка в том, что я не отредактировал эту строку в первую очередь

person Andriel    schedule 15.09.2015

Попробуй это:

JSONObject mainObject = new JSONObject(resmsg);
JSONArray searchResults =  mainObject.getJSONArray("searchResults");
for(int i=0 ;i <searchResults.lenth() ; i++)
{
JSONObject searchObject = searchResults.getJSONObject(i);
JSONObject objectField = searchObject.getJSONObject("fields");
JSONObject mqap_geography = objectField.getJSONObject("mqap_geography");
JSONObject latLng = mqap_geography.getJSONObject("latLng");
Double lat = Double.parseDouble(latLng.getString("lat"));
Double lon = Double.parseDouble(latLng.getString("lng"));
}
person Arvind    schedule 15.09.2015