Android-—用JSONObject解析JSON 数据

下面将以一个例子来讲解如何使用 JSONObject 去解析JSON

第一步:准备工作

这里我用的是一个百度地图定位的链接,打开就可以看到这次要解析的JSON了

ps:地址后面的 ak 可以直接用,如果失效的话可以去百度地图开放平台申请一个

百度地图定位:http://api.map.baidu.com/geocoder/v2/?location=39.934,116.329&output=json&pois=1&ak=4hWL4Pn8THzPoCGSlS10GNdexou9cZif

如果觉得乱,推荐用这个网站整好看些

JSON在线工具:http://www.sojson.com/



第二步:明确要获取的数据的父子关系

假如我们要获取的是下图划红线部分的文字,下面文章出现的键名表示要获取的数据的标签名,如addr

其中蓝色部分的“result”和“pois”表示父级关系

Android-—用JSONObject解析JSON 数据_第1张图片



第三步:代码实现

package com.example.administrator.httpdemo.HttpURLConnectionFile;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

import com.example.administrator.httpdemo.R;

import org.json.JSONArray;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class MainActivity extends Activity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //这里用百度地图的一个api来做例子(地址后面的ak可以直接用,如果失效的话可以去申请一个)
        sendReques("http://api.map.baidu.com/geocoder/v2/?location=39.934,116.329" +
                "&output=json&pois=1&ak=4hWL4Pn8THzPoCGSlS10GNdexou9cZif");

    }

    /*  我这里是用HttpURLConnection来发送请求,获取json数据
        你也可以直接把json转成String类型再来解析
        这里就不细讲得到json的过程
    */
    private void sendReques(final String strURL) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                HttpURLConnection connection = null;
                BufferedReader reader = null;
                try {
                    URL url = new URL(strURL);
                    connection = (HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("GET");
                    connection.setConnectTimeout(2000);
                    connection.setReadTimeout(5000);
                    InputStream is = connection.getInputStream();
                    reader = new BufferedReader(new InputStreamReader(is));
                    StringBuilder sb = new StringBuilder();
                    String line;
                    while ((line = reader.readLine()) != null) {
                        sb.append(line);
                    }
                    //开始解析 (传入String类型的json)
                    pareJSONwithJSONObject(sb.toString());

                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (reader != null) {
                        try {
                            reader.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    if (connection != null) {
                        connection.disconnect();
                    }
                }
            }
        }).start();
    }

    //解析方法
    private void pareJSONwithJSONObject(String jsonData) {
        try {
            //将服务器返回的数据传入到JSONObject对象中
            JSONObject object = new JSONObject(jsonData);

            //将object中的 result{} 作为一个对象传入到 object2 中
            JSONObject object2 = object.getJSONObject("result");

            //由于(划蓝线部分)pois[]它是一个数组的形式,
            //我们需要调用getJSONArray()方法并传给 JSONArray

            JSONArray jsonArray = object2.getJSONArray("pois");

            //遍历数组
            for (int i = 0; i < jsonArray.length(); i++) {
                //通过角标获取"数组"的对象
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                //通过调用getString("划红线部分的键名")方法获取想要的数据
                String str_addr = jsonObject.getString("addr");
                //打开Logcat,查看是是否得到想要获取的数据
                Log.d("logcity", str_addr);
            }
        } catch (Exception e) {

        }
    }

}



概括:

一般情况下,如果你想获取的数据不包含在数组中,只要一直嵌套,最后调用getString()方法获取就行了,代码如下:

/*假如只嵌套了两层*/
    JSONObject object = new JSONObject("json数据源");
    JSONObject object2 = object.getJSONObject("键名的父级的父级");
    JSONObject object3 = object2.getJSONObject("键名的父级");
    String string = jsonObject3.getString("键名");
如果想获取的数据包含在数组中,可以先遍历再取值;

步骤:遍历数组—>调用getJSONObject(index)方法—>再调用getString("键名")方法即可;

其中,index表示角标。代码如下:

 JSONObject jsonObject = jsonArray.getJSONObject(index);
 String string = jsonObject.getString("键名");


你可能感兴趣的:(Android)