Как разобрать JSON с несколькими массивами (Java)

В настоящее время я работаю над проектом, который требует широты и долготы заданного адреса (ввод). API карт Google возвращает данные в формате json, и я провел исследование и обнаружил, что json-simple — лучший вариант для моего проекта. У меня есть этот код, а также вывод String из API карт Google, и я был бы очень признателен за помощь в правильном анализе. Также обратите внимание: вызов: MapTile.receiveJson просто возвращает строку из API Google (ссылка ниже)

try {
            String jsonAdr = MapTile.receiveJson("http://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA");
            JSONParser parser = new JSONParser();
            JSONObject json = (JSONObject)parser.parse(jsonAdr);  
            System.out.println("lat=" + json.get("address_components"));
        } catch (Exception e1) {e1.printStackTrace();System.out.println("Error contacting google or invalid input");}

Это точный вывод строки из API Google:

http://maps.googleapis.com/maps/api/geocode/json?address=1600+Амфитеатр+Паркуэй,+Горы+Вид,+CA

Я понимаю, что могу выполнять синтаксический анализ строк, однако это будет неэффективно, поскольку я буду использовать больше API Google. Я также просмотрел другие переполнения стека, а также их веб-сайт JSON, но не нашел примеров с несколькими массивами JSON, такими как те, что возвращаются Google.

Любая помощь приветствуется.


person user3740929    schedule 14.06.2014    source источник
comment
Прежде чем вы сможете получить address_components, вы должны получить массив results, затем из него первый (или любой) элемент, а затем вы можете прочитать address_components.   -  person Philipp Gayret    schedule 14.06.2014


Ответы (2)


Вот решение:

Я в основном сделал автономный и проанализировал ваш JSON следующим образом:

Первый: это метод, который я использовал для анализа JSON:

public String loadJSON(String someURL) {

        String json = null;
        HttpClient mHttpClient = new DefaultHttpClient();
        HttpGet mHttpGet = new HttpGet(someURL);

        try {

            HttpResponse mHttpResponse = mHttpClient.execute(mHttpGet);
            StatusLine statusline = mHttpResponse.getStatusLine();
            int statusCode = statusline.getStatusCode();
            if (statusCode != 200) {

                return null;

            }
            InputStream jsonStream = mHttpResponse.getEntity().getContent();

            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    jsonStream));

            StringBuilder builder = new StringBuilder();
            String line;

            while ((line = reader.readLine()) != null) {

                builder.append(line);

            }

            json = builder.toString();

        } catch (IOException ex) {

            ex.printStackTrace();

            return null;
        }
        mHttpClient.getConnectionManager().shutdown();
        return json;

    }

Второй: использовал асинхронную задачу для загрузки данных:

public class BackTask extends AsyncTask<Void, Void, Void> {

        String url;

        public BackTask(String URL) {
            super();
            this.url = URL;

        }

        @Override
        protected Void doInBackground(Void... params) {

            getData(url);
            return null;
        }

    }

Третий: способ получения данных и их анализа. Я сделал несколько комментариев к этой части, так как она немного длиннее, чем обычно.

public void getData(String URL) {

        try {
            JSONObject mainJsonObject = new JSONObject(loadJSON(URL));
            // Log.d("JSON Data : ", mainJsonObject.toString());

            String Status = mainJsonObject.getString("status");
            Log.d("JSON Status : ", Status + "\n" + "---------------------");

            JSONArray mainArray = mainJsonObject.getJSONArray("results");
            // Log.d("JSON Array : ", mainArray.toString());

            for (int i = 0; i < mainArray.length(); i++) {

                JSONObject insideJsonObject = mainArray.getJSONObject(i);

                if (insideJsonObject != null) {

                    String address_components = insideJsonObject
                            .getString("address_components");
                    // Log.d("Inside JSON Array : ", address_components);

                    JSONArray addressJSON = insideJsonObject
                            .getJSONArray("address_components");
                    // Log.d("Inside JSON ADDress : ", addressJSON.toString());

                    String formatted_address = insideJsonObject
                            .getString("formatted_address");
                    Log.d("Inside JSON formatted_address : ", formatted_address
                            + "\n" + "-----------");

                    for (int ji = 0; ji < mainArray.length(); ji++) {

                        JSONObject geoMetryJO = mainArray.getJSONObject(ji);

                        if (geoMetryJO != null) {

                            JSONObject geometry = geoMetryJO
                                    .getJSONObject("geometry");
                            // Log.d("Inside JSON geometry : ",
                            // geometry.toString()+"\n"+"----------");

                            String location_type = geometry
                                    .getString("location_type");
                            Log.d("Inside JSON location_type : ", location_type
                                    + "\n" + "------------");

                            JSONObject locationJSONObject = geometry
                                    .getJSONObject("location");

                            String Latitude = locationJSONObject
                                    .getString("lat");
                            Log.d("Inside JSON Latitude : ", Latitude + "\n"
                                    + "--------------");
                            String Longitude = locationJSONObject
                                    .getString("lng");
                            Log.d("Inside JSON Longitude : ", Longitude + "\n"
                                    + "------------");

                            JSONObject viewportJSONObject = geometry
                                    .getJSONObject("viewport");
                            // Log.d("Inside JSON viewportJSONObject : ",
                            // viewportJSONObject.toString()+"\n"+"------------");

                            JSONObject northeastJSONObject = viewportJSONObject
                                    .getJSONObject("northeast");
                            String Lat = northeastJSONObject.getString("lat");
                            Log.d("Inside JSON Lat : ", Lat + "\n"
                                    + "------------");
                            String Lon = northeastJSONObject.getString("lng");
                            Log.d("Inside JSON Lon : ", Lon + "\n"
                                    + "------------");

                            JSONObject southwestJSONObject = viewportJSONObject
                                    .getJSONObject("southwest");
                            String south_Lat = southwestJSONObject
                                    .getString("lat");
                            Log.d("Inside JSON south_Lat : ", south_Lat + "\n"
                                    + "------------");
                            String south_Lon = southwestJSONObject
                                    .getString("lng");
                            Log.d("Inside JSON south_Lon : ", south_Lon + "\n"
                                    + "------------");
                        }

                    }

                    for (int k = 0; k < addressJSON.length(); k++) {

                        JSONObject addressJSONObject = addressJSON
                                .getJSONObject(k);

                        if (addressJSONObject != null) {

                            String long_name = addressJSONObject
                                    .getString("long_name");
                            Log.d("Inside JSON LongName : ", long_name);
                            String short_name = addressJSONObject
                                    .getString("short_name");
                            Log.d("Inside JSON ShortName : ", short_name);

                            JSONArray addressJSONArray = addressJSONObject
                                    .getJSONArray("types");
                            Log.d("Inside JSON JSONADD : ",
                                    addressJSONArray.toString() + "\n"
                                            + "-------------");

                        }

                    }

                    JSONArray insideJsonArray = insideJsonObject
                            .getJSONArray("types");
                    Log.d("Inside JSON Types : ", insideJsonArray.toString());
                    String street = insideJsonObject.getString("types");
                    Log.d("Inside JSON Street : ", street);

                }

            }

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

После получения всех данных вы можете использовать их как угодно, так как в основном они представлены в строковом формате. Вы можете просто скопировать и вставить этот метод, и он должен работать нормально.

Четвёртое: в методе onCreate() только что выполнили такую ​​задачу:

public static final String URL = "http://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA";
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new BackTask(URL).execute();

    }

Это было полное решение этого вопроса. Дайте мне знать, если у вас есть какие-либо вопросы по этому поводу. Надеюсь это поможет. Удачи.. :)

person mike20132013    schedule 16.06.2014

Я сделал это для formatted_address. Я набираю явно здесь. Но методы getJSONArray() и getJSONObject() также будут выполнять приведение типов.

// parse the Result String to JSON
JSONObject myJSONResult = new JSONObject(results);
for (int i = 0; i <((JSONArray) myJSONResult.get("results")).length(); i++) 
    System.out.println(((JSONObject) ((JSONArray) myJSONResult.get("results")).get(i)).get("formatted_address")); // This is your final options.
person D V Santhosh Kiran    schedule 08.04.2015