解析JSON格式数据
比起XML,JSON的主要优势在于它的体积更小,在网络上传输的时候可以更省流量。但缺点在于,它的语义性较差,看起来不如XML直观。
在开始之前,我们需要在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”]
访问http://127.0.0.1/get_data.json这个网址,就应该出现如图9.8所示的内容。
下面开始在Android中解析这些数据
使用JSONObject
private void sendRequestWithOkHttp() {
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
//指定访问的服务器地址是电脑本机
.url("http://10.0.2.2/get_data.json")
.build();
Response response = client.newCall(request).execute();
String responseData = response.body().string();
parseJSONWithJSNOObject(responseData);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
private void parseJSONWithJSNOObject(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) {
e.printStackTrace();
}
}
定义一个JSONArray数组,并将服务器返回的数据传入;然后遍历这个数组,从中取出的每一个元素都是一个JSONObject对象,在每个JSONObject对象中又会包含字段,通过get方法就可以把数据取出。
二、GSON
既然是开源库,就需要在app/build.gradle文件中导入
compile ‘com.google.code.gson:gson:2.7’
GSON库主要是将一段JSON格式的字符串自动映射成一个对象,从而不需要我们在手动编写代码进行解析。
比如一段JSON格式的数据如下:
{“name”:”ads”, “age”:”12”}
我们就可以定义一个类,并加入name和age这两个字段,通过以下代码就可以将JSON数据自动解析成一个Person对象了。
Gson gson = new Gson();
Person person = gson.fromJson(jsonData, Person.class);
如果解析的是JSONS数组,可以使用以下方式:
List<Person> person = gson.fromJson(jsonData, new TypeToken<List<Person>>(){}.getType());
基本的语法就是这样,首先新增一个App类,并加入id、name、和version这三个字段,如下所示:
public class JSONData {
String id;
String version;
String name;
public String getName() {
return name;
}
public String getId() {
return id;
}
public String getVersion() {
return version;
}
public void setName(String name) {
this.name = name;
}
public void setId(String id) {
this.id = id;
}
public void setVersion(String version) {
this.version = version;
}
}
MainActivity.java
private void sendHttpRequset() {
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient client = new OkHttpClient.Builder()
.writeTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.connectTimeout(100, TimeUnit.SECONDS)
.build();
// OkHttpClient client = new OkHttpClient();
Request requset = new Request.Builder()
// 指定服务器的地址 - 10.0.2.2对于模拟器来说就是电脑本机的IP地址
.url("http://10.0.2.2/get_data.json")
.build();
Response response = client.newCall(requset).execute();
String responseData = response.body().string();
parseJSONWithGSON(responseData);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
private void parseJSONWithGSON(String jsonData) {
Gson gson = new Gson();
List<JSONData> jsonDataList = gson.fromJson(jsonData, new TypeToken<List<JSONData>>(){}.getType());
for(JSONData data : jsonDataList){
Log.d(TAG, "id is:"+data.getId());
Log.d(TAG, "id is:"+data.getName());
Log.d(TAG, "id is:"+data.getVersion());
}
}