Android 之JSON数据解析

(以下基本都是郭霖大神《第一行代码》中的知识)

JSON数据与xml相比,优势在于体积更小,传输所需的流量少。但是缺点也很明显,就是语义性较差。

下面是一组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"}]

解析JSON的方法同样很多,这里主要说一下官方提供的JSONObject和谷歌提供的开源库GSON。

1 使用JSONObject解析JSON数据

先看代码

public void parseJSONWithJSONObject(String jsonData){
    try{
        JSONArray jsonArray = new JSONArray(jsonData);
        for(int i=0;i<jsonArray.length();i++){
            JSONOject 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();
    }
}

可以看到JSON数据的解析相对XML数据的解析会简单很多。

首先是获取JSONArray数组实例。

然后通过这个实例的getJSONObject()方法,获取index对应的JSONObject实例。

最后通过JSONObject实例的getString()方法,获取“键”所对应的值。

 

1.1 JSONArray

下面是Android API中对JSONArray类的描述。可以看到JSONArray是一个有序的值序列。它的外部文本形式是用方括号括起来的字符串,用逗号分隔值。

内部形势是通过get和opt方法可以通过“索引”获取“值”的对象,“值”可以通过put方法改变或者添加。

 

1.2 JSONObject

JSONObject 是个无序的键值对的集合。它的外部形式是一个用大括号括起来的字符串,在键和值之间有冒号,值和下一个键之间是逗号。

内部形式是一个具有get和opt方法的对象,用于按键访问值,通过put方法可以改变或添加值。

 

2 使用GSON解析JSON数据

 使用谷歌开源库GSON解析JSON数据也相当简单。它可以将一段JSON格式的字符串自动映射成一个对象,从而不需要我们再手动去编写代码进行解析了。

比如我们有下面这段JSON数据。

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

要解析这段数据我们创建一个与它对应的类Person,里面加入name age两个字段。

之后使用下面这段代码就可以解析这段JSON数据了。

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

之后就可以和操作普通对象一样获取数据。比如需要获取人的名字:

String name = person.getName();

如果需要解析一段JSON数据,则需要借助TypeToken将期望解析成的数据类型传入到fromJson()方法中,如下所示:

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

下面是使用GSON解析JSON数据的代码。

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

其中App是我们创建的一个类,里面存放了id name version等字段以及他们的get set方法。

 

综上JSON的解析就说完了。比XML还是简单很多。

 

posted on 2017-03-22 10:32  猫咪大王  阅读(175)  评论(0编辑  收藏  举报