如何使用GSON解析JSON数据
作者:冰之沁泠
GSON是谷歌提供的一个开源库,可以用来解析JSON数据
添加依赖
不过GSON并没有被添加到Android官方的API中,所以如果要使用这个开源库,我们就要先添加依赖,编辑app/build.gradle文件,
在dependencies闭包中添加如下内容:
implementation 'com.google.code.gson:gson:2.7'
JSON数据介绍
JSON数据分为两种,对象和数组,用{ }括起来的是对象,用[ ]括起来的是数组。
对象:
{ "user": "user1", "pwd": "123456" }
此处是一个JSON对象,里面有两个字段,分别是user和pwd。
数组:
[ {"user": "user1", "pwd": "123456"}, {"user": "user2", "pwd": "123456"} ]
此处是一个JSON数组,数组里面包含两个对象,每个对象包含两个字段。
字段和数组
{ "user": "user1", "pwd": "123456", "jsonArray": [ {"user": "user1", "pwd": "123456"}, {"user": "user2", "pwd": "123456"} ], "result": "成功" }
此处是一个JSON对象,里面包含了字段和数组。
在实际情况中,一般都是一个JSON对象里面有数组和其它字段,或者是很多的嵌套,我们只需要一层一层的去解析就可以了。
GsonFormat
Gson是采用对象映射的方式,所以我们要为JSON数据创建一个Java对象来与之对应。
我们可以使用GsonFormat插件,迅速的将JSON数据转换成Java对象,使用方法如下:
1、安装好GsonFormat插件
2、新建一个类,在类里的空白处按Alt+S键,并将要转换的JSON数据复制进去,界面如下所示:
注意:自动生成的时候,内部类可能会是静态的,手动把内部类的static去掉。
@SerializedName注解
由于JSON中的一些字段可能不太适合直接作为Java字段来命名,因此这里使用了@SerializedName注解的方式来让JSON字段和Java字段之间建立映射关系。
例:
此处的Test类为JSON数据的一个映射类,而USER和PWD为JSON数据中的两个字段,很明显,这两个字段的名字不适合做变量名,所以使用@SerializedName注解的方式来让USER和user建立映射关系,PWD和password建立映射关系。
Gson的使用
解析JSON对象
Gson gson = new Gson(); User user = gson.fromJson(jsonData, User.class);
此处的User类是JSON数据的一个映射类,jsonData是JSON数据,注意:此处是一个字符串,所有的JSON数据都放在这个字符串中,一般为服务器返回的数据。
解析JSON数组
Gson gson = new Gson(); List<User> userList = gson.fromJson(jsonData, new TypeToken<User>(){}.getType());
因为是解析JSON数组,所以我们要用一个List来存放这个数组,List中的每一个对象就是JSON数组中的每一个元素。
具体实例
要解析的JSON数据:
{ "user": "user1", "pwd": "123456", "jsonArray": [ {"user": "user1", "pwd": "123456"}, {"user": "user2", "pwd": "123456"} ], "result": "成功" }
映射的Java类:
public class Data { private String user; private String pwd; private String result; private List<JsonArrayBean> jsonArray; public String getUser() { return user; } public void setUser(String user) { this.user = user; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public String getResult() { return result; } public void setResult(String result) { this.result = result; } public List<JsonArrayBean> getJsonArray() { return jsonArray; } public void setJsonArray(List<JsonArrayBean> jsonArray) { this.jsonArray = jsonArray; } public class JsonArrayBean { private String user; private String pwd; public String getUser() { return user; } public void setUser(String user) { this.user = user; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } } }
解析的方法:
private void parseJSONData(String jsonData) { Gson gson = new Gson(); Data data = gson.fromJson(jsonData, Data.class); // data就是整个JSON数据映射的一个对象 String result = data.getResult(); // 取result字段的值 String pwd = data.getPwd(); // 取pwd字段的值 String user = data.getUser(); // 取user字段的值 // 因为jsonArray字段对应的是一个JSON数组,所以要用一个List来对应 List<Data.JsonArrayBean> list = data.getJsonArray(); //取值 for (int i = 0; i < list.size(); i++) { Data.JsonArrayBean jsonArrayBean = list.get(i); String user1 = jsonArrayBean.getUser(); String pwd1 = jsonArrayBean.getPwd(); } }
此处没有给出网络通信的代码,只给出了解析JSON数据的代码。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。