解析JSON数据

来源:互联网 发布:java 分布式 dubbo 编辑:程序博客网 时间:2024/06/05 16:44

比起 XML,JSON的主要优势在于它的体积更小,在网络上传输的时 候可以更省流量。但缺点在于,它的语义性较差,看起来不如 XML直观

ps:
Apache服务器的下载与安装

htdocs下增加get_data.json文件
并加入如下 JSON格式的内容:

[{"id":"5","version":"5.5","name":"Angry Birds"},{"id":"6","version":"7.0","name":"Clash of Clans"},{"id":"7","version":"3.5","name":"Hey Day"}]

这时在浏览器中访问 http://127.0.0.1/get_data.json这个网址,可以得到

这里写图片描述

这样我们把 JSON格式的数据也准备好了,下面就开始学习如何在 Android程序 中解析这些数据吧

使用 JSONObject

类似地,解析 JSON数据也有很多种方法,可以使用官方提供的 JSONObject,也可以使 用谷歌的开源库 GSON。另外,一些第三方的开源库如 Jackson、FastJSON等也非常不错。这里先来学习JSONObject

以下代码仍然是基于
HttpURLConnection使用这篇文章进行的修改

修改 MainActivity中的代码

private void sendRequestWithURLConnection() {        //开启线程发起网络请求        new Thread(new Runnable() {            @Override            public void run() {                HttpURLConnection connection = null;                try {                    URL url = new URL("http://192.168.1.51/get_data.json");                    connection = (HttpURLConnection) url.openConnection();                    connection.setRequestMethod("GET");                    connection.setConnectTimeout(8000);                    connection.setReadTimeout(8000);                    InputStream inputStream = connection.getInputStream();                    //对获取的输入流进行读取                    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));                    StringBuilder response = new StringBuilder();                    String line;                    while ((line = reader.readLine()) != null) {                        response.append(line);                    }                    parseJSONWithJSONObject(response.toString());                } catch (MalformedURLException e) {                } catch (ProtocolException e) {                    e.printStackTrace();                } catch (IOException e) {                    e.printStackTrace();                }            }        }).start();    }    private void parseJSONWithJSONObject(String jsonData){        try {            JSONArray jsonArray = new JSONArray(jsonData);            for(int i=0;i<jsonArray.length();i++){                JSONObject jsonObject = jsonArray.getJSONObject(i);                String id = jsonObject.getString("id");                String name = jsonObject.getString("name");                String version = jsonObject.getString("version");                Log.d("MainActivity", "id is " + id);                Log.d("MainActivity", "name is " + name);                Log.d("MainActivity", "version is " + version);            }        } catch (JSONException e) {        }    }

首先记得要将 HTTP请求的地址改成 http://自己电脑ip地址/get_data.json,

[查看电脑ip地址]
http://blog.csdn.net/u010356768/article/details/77744688

然后在得到了服务器 返回的数据后调用 parseJSONWithJSONObject()方法来解析数据

解析 JSON的 代码真的是非常简单,由于我们在服务器中定义的是一个 JSON数组,因此这里首先是将服 务器返回的数据传入到了一个 JSONArray对象中。然后循环遍历这个 JSONArray,从中取出 的每一个元素都是一个 JSONObject 对象,每个 JSONObject 对象中又会包含 id、name 和 version这些数据

接下来只需要调用 getString()方法将这些数据取出,并打印出来即可

这里写图片描述

使用 GSON

GSON是Google开发的Java API,用于转换Java对象和Json对象,它的github地址为
https://github.com/google/gson

使用
在项目的build.gradle中添加依赖

compile ‘com.google.code.gson:gson:2.8.2’

那么GSON库究竟是神奇在哪里呢?其实它主要就是可以将一段JSON格式的字符串自 动映射成一个对象,从而不需要我们再手动去编写代码进行解析了

比如说一段 JSON格式的数据如下所示:

{"name":"Tom","age":20}

那我们就可以定义一个 Person类,并加入 name和 age这两个字段

然后只需简单地调 用如下代码就可以将 JSON数据自动解析成一个 Person对象了:

Gson gson = new Gson();Person person = gson.fromJson(jsonData, Person.class); 

如果需要解析的是一段 JSON数组会稍微麻烦一点,我们需要借助 TypeToken将期望解 析成的数据类型传入到 fromJson()方法中,如下所示:

List<Person> people = gson.fromJson(jsonData, new TypeToken<List<Person>>() {}.getType());

好了,基本的用法就是这样,下面就让我们来真正地尝试一下吧

首先新增一个 App 类,并加入 id、name和 version这三个字段,如下所示:

public class App {    private String id;    private String name;    private String version;    public String getId() {        return id;    }    public void setId(String id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getVersion() {        return version;    }    public void setVersion(String version) {        this.version = version;    }}

然后修改 MainActivity中的代码,如下所示:

    private void sendRequestWithURLConnection() {        //开启线程发起网络请求        new Thread(new Runnable() {            @Override            public void run() {                HttpURLConnection connection = null;                try {                    URL url = new URL("http://192.168.1.51/get_data.json");                    connection = (HttpURLConnection) url.openConnection();                    connection.setRequestMethod("GET");                    connection.setConnectTimeout(8000);                    connection.setReadTimeout(8000);                    InputStream inputStream = connection.getInputStream();                    //对获取的输入流进行读取                    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));                    StringBuilder response = new StringBuilder();                    String line;                    while ((line = reader.readLine()) != null) {                        response.append(line);                    }                    parseJSONWithGSON(response.toString());                } catch (MalformedURLException e) {                } catch (ProtocolException e) {                    e.printStackTrace();                } catch (IOException e) {                    e.printStackTrace();                }            }        }).start();    }    private void parseJSONWithGSON(String jsonData){        Gson gson = new Gson();        List<App> appList = gson.fromJson(jsonData, new TypeToken<List<App>>() {}.getType());        for(App app:appList){            Log.d("MainActivity","id is "+app.getId());            Log.d("MainActivity","name is "+app.getName());            Log.d("MainActivity","version is "+app.getVersion());        }    }

打印日志如下

这里写图片描述

原创粉丝点击