Json 介绍
Json 是一种文本形式的数据交换格式,比起 XML,JSON 的主要优势在于它的体积更小,在网络上传输的时候可以更省流量。但缺点在于,它的语义性较差,看起来不如 XML 直观
使用 JSONObject 解析 Json
解析 Json 数据也有很多种方法,可以使用官方提供的 JSONObject,也可以使用谷歌的开源库 GSON。另外,一些第三方的开源库如 Jackson、FastJSON 等也非常不错。这里先来学习JSONObject
之前的章节中我们安装了 Tomcat,如果不了解可以学习:Tomcat安装。在 downloads 文件夹下放入 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:8080/downloads/data.json
以下代码是基于 HttpURLConnection 这篇文章进行的修改,这里我们重点关注如何解析 json 即可
修改 MainActivity 中的代码
private void sendRequestWithURLConnection() {
//开启线程发起网络请求
new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection connection = null;
try {
URL url = new URL("http://192.168.3.208:8080/downloads/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 请求的地址改成自己的 ip(查看电脑ip)
然后在得到了服务器返回的数据后调用 parseJSONWithJSONObject()
方法来解析数据
解析 JSON的 代码真的是非常简单,由于我们在服务器中定义的是一个 JSON 数组,因此这里首先是将服务器返回的数据传入到了一个 JSONArray 对象中。然后循环遍历这个 JSONArray,从中取出的每一个元素都是一个 JSONObject 对象,每个 JSONObject 对象中又会包含 id、name 和 version这些数据
接下来只需要调用 getString()
方法将这些数据取出,并打印出来即可
使用 GSON 解析 Json
GSON 是 Google 开发的 Java API,用于转换 Java 对象和 Json 对象。Gson Github主页
使用
在项目的 build.gradle 中添加依赖
implementation 'com.google.code.gson:gson:2.8.5'
那么 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 中的代码:
//调用解析方法时,把 parseJSONWithJSONObject(response.toString()); 改为 parseJSONWithGSON(response.toString());
//parseJSONWithJSONObject(response.toString());
parseJSONWithGSON(response.toString());
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());
}
}
运行结果相同
学习更多:Android Gson使用详解
Fastjson
FastJson 是阿里的开源框架,被不少企业使用,是一个极其优秀的Json框架,Fastjson Github地址
Fastjson 提供了两种版本:标准版本,Android 版本,所以添加 Gradle 依赖也有所不同
两个版本区别可以查看文档
# 标准版
implementation 'com.alibaba:fastjson:1.2.55'
# android版
implementation 'com.alibaba:fastjson:1.1.70.android'
我们使用 fastJson 来解析刚才的一段 json 数据
private void parseJSONWithFastJson(String jsonData){
List<App> list = JSONArray.parseArray(jsonData, App.class);
for(App app:list){
Log.d("MainActivity","id is "+app.getId());
Log.d("MainActivity","name is "+app.getName());
Log.d("MainActivity","version is "+app.getVersion());
}
}
结果和之前是一样的