解析JSON

使用JSONObject

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

在开始之前, 我们还需要在C:\Apache\htdocs目录中新建一个get_data.json的文件, 然后编辑这个文件, 并加入如下JSON格式的内容:

[{"id":"5","version":"5.5","name":"Clash of Clans"},
{"id":"6","version":"7.0","name":"Boom Beach"},
{"id":"7","version":"3.5","name":"Clash Royale"}]Code language: JSON / JSON with Comments (json)

类似地, 解析JSON数据也有很多种方法, 可以使用官方提供的JSONObject, 也可以使用谷歌的开源库GSON。 另外, 一些第三方的开源库如Jackson、 FastJSON等也非常不错。 本节中我们就来学习一下前两种解析方式的用法。

使用JSONObject解析JSON数据:

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 (Exception e) {
        e.printStackTrace();
    }
}Code language: JavaScript (javascript)

使用GSON

如果你认为使用JSONObject来解析JSON数据已经非常简单了, 那你就太容易满足了。 谷歌提供的GSON开源库可以让解析JSON数据的工作简单到让你不敢想象的地步, 那我们肯定是不能错过这个学习机会的。

不过GSON并没有被添加到Android官方的API中, 因此如果想要使用这个功能的话, 就必须要在项目中添加GSON库的依赖。 编辑app/build.gradle文件, 在dependencies闭包中添加如下内容:

compile 'com.google.code.gson:gson:2.7'Code language: JavaScript (javascript)

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

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

{"name":"Tom","age":20}Code language: JSON / JSON with Comments (json)

那我们就可以定义一个Person 类, 并加入name 和age 这两个字段, 然后只需简单地调用如下代码就可以将JSON数据自动解析成一个Person 对象了:

Gson gson = new Gson();
Person person = gson.fromJson(jsonData, Person.class);Code language: PHP (php)

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

List<Person> people = gson.fromJson(jsonData, new TypeToken<List<Person>>() {}.getType());Code language: PHP (php)

定义App类:

package cn.bamn.www.myapplication;

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;
    }
}Code language: JavaScript (javascript)

使用GSON解析JSON数据:

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());
    }
}Code language: PHP (php)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注