【问题标题】:How to parse a multi-array JSON (Java)如何解析多数组 JSON (Java)
【发布时间】:2014-08-05 01:31:09
【问题描述】:

我目前正在处理一个需要给定地址(输入)的纬度和经度的项目。 Google maps API 以 json 格式返回,我进行了研究,发现 json-simple 是我项目的最佳选择。我有这段代码以及来自谷歌地图 API 的字符串输出,非常感谢在正确解析方面的帮助。 另请注意:调用:MapTile.receiveJson 只是从 google 的 API(链接如下)返回字符串

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

这是从 google 的 API 输出的确切字符串:

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

我意识到我可以进行字符串解析,但它会效率低下,因为我将使用更多的 google 的 API。我还查看了其他堆栈溢出以及他们的 JSON 网站,但没有发现具有多个 JSON 数组的示例,例如 google 返回的那些。

非常感谢任何帮助。

【问题讨论】:

  • 在获得address_components 之前,您必须先获得results 数组,然后从该数组的第一个(或任何)元素中读出address_components。

标签: java javascript json google-maps google-maps-api-3


【解决方案1】:

解决方案如下:

我基本上做了一个独立的,我像这样解析你的 JSON:

First:这是我用来解析 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;
        }

    }

第三:获取数据并解析的方法。 我为这部分制作了一些cmets,因为它比平时有点长。

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

    }

这是这个问题的完整解决方案。如果对此有任何疑问,请告诉我。希望这会有所帮助..祝你好运.. :)

【讨论】:

    【解决方案2】:

    我这样做是为了 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.
    

    【讨论】:

      猜你喜欢
      • 2014-03-17
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2014-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多