JSON的主要优势在于它的体积小,在网络上传输时可以更省流量。解析 JSON数据有很多种方法,可以使用官方提供的JSONObject,也可以使用谷歌的开源库GSON。另外,一些第三方的开源库,如Jackson,FastJSON等也非常不错。主要讲下前两种方法。
在开始之前,先在本地服务器如tomcat,在E:\apache-tomcat-7.0.22\webapps\ROOT目录中新建一个get_data.json的文件,并加入如下JSON格式的内容:
[{"id":"5","version":"5.5","name":"Angry Birds"},
{"id":"6","version":"6.5","name":"Clash of Clans"},
{"id":"7","version":"7.5","name":"Hey Day"}]
准备好数据之后,我们先来看下JSONObject如何解析JSON数据:
//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();
}
}
在得到了服务器返回的数据后,调用parseJSONWithJSONObject()方法来解析数据。可以看到,解析JSON的代码真的是非常简单,由于我在服务器中定义的是一个JSON数组,因此这里首先是将服务器返回的数据传入到一个JSONArray对象中。然后循环遍历这个JSONArray,从中取出的每一个元素都是一个JSONObject对象,每个JSONObject对象中又包含id、name和version这些数据。接下来只需要调用getString()方法将这些数据取出来,并打印即可。
下面来看下GSON如何解析JSON数据。不过GSON并没有被添加到Android官方的API中,因此需要在项目中添加一个GSON的jar包。
接下来我们需要根据服务器端的JSON数据新增一个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;
}
}
接下来编写parseJSONWithGSON()方法解析JSON数据:
//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());
}
}
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<App> appList = gson.fromJson(jsonData, new TypeToken<List<App>>(){}.getType());
这样我们就可以解析服务器传来的JSON数据了,项目运行结果如下:
注:文章采摘自《第一行代码》