Cara mengurai JSON multi-array (Java)

Saat ini saya sedang mengerjakan proyek yang memerlukan garis lintang dan bujur dari alamat tertentu (input). Google Maps API kembali dalam format json, dan saya telah melakukan penelitian dan menemukan bahwa json-simple adalah pilihan terbaik untuk proyek saya. Saya memiliki kode ini serta keluaran String dari Google Maps API, dan akan sangat menghargai bantuan dalam penguraian dengan benar. Perhatikan juga: panggilan: MapTile.receiveJson baru saja mengembalikan string dari API Google (ditautkan di bawah)

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");}

Ini adalah keluaran string yang tepat dari API Google:

http://maps.googleapis.com/maps/api/geocode/json?address=1600+Amfiteater+Parkway,+Mountain+View,+CA

Saya sadar saya bisa melakukan penguraian String, namun itu tidak efisien karena saya akan menggunakan lebih banyak API Google. Saya juga telah melihat stack overflow lainnya, serta situs web JSON mereka tetapi tidak menemukan contoh dengan beberapa array JSON seperti yang dikembalikan oleh Google.

Bantuan apa pun sangat dihargai.


person user3740929    schedule 14.06.2014    source sumber
comment
Sebelum Anda bisa mendapatkan address_components Anda harus mendapatkan array results, lalu dari elemen pertama (atau apa pun), dan kemudian Anda bisa membacakan address_components.   -  person Philipp Gayret    schedule 14.06.2014


Jawaban (2)


Inilah solusinya:

Saya pada dasarnya membuat berdiri sendiri dan menguraikan JSON Anda seperti ini:

Pertama : Ini adalah metode yang saya gunakan untuk mengurai 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;

    }

Kedua : Menggunakan Tugas Async untuk mengunduh data:

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;
        }

    }

Ketiga: Metode untuk mengambil data dan menguraikannya. Saya telah memberikan beberapa komentar untuk bagian ini karena ini agak panjang dari biasanya.

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();
        }

    }

Setelah mendapatkan semua data, Anda dapat menggunakannya sesuka Anda karena sebagian besar dalam format string. Anda cukup menyalin dan menempelkan metode ini dan metode ini akan berjalan dengan baik.

Keempat : Pada metode onCreate(), jalankan saja tugas seperti ini:

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();

    }

Ini adalah solusi lengkap untuk pertanyaan ini. Beri tahu saya jika ada pertanyaan mengenai hal ini. Semoga ini bisa membantu..Semoga Sukses.. :)

person mike20132013    schedule 16.06.2014

Saya melakukan ini untuk format_address. Saya mengetik secara eksplisit di sini. Namun metode getJSONArray() dan getJSONObject() akan melakukan typecasting juga.

// 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