Json文件在网络数据传输中可以说是最常使用的数据格式,因此在我们的日常开发中,对于Json文件格式的解析以及转换可以说是非常重要的,因此在这介绍以下对于Json文件格式的解析以及各种转换方式。
Json文件介绍
{ "code": 200,
"msg": "OK",
"muser": [
{"name": "zhangsan","age": "10","phone": "11111","email":"11111@11.com"},
{"name": "lisi","age": "20","phone": "22222","email": "22222@22.com"},
...]
}
由上面可以看出JSON数据就是一段字符串而已,只不过有不同意义的分隔符将其分割开来而已,我们看上面的符号,里面有[] ,{}等符号,其中:
- []中括号代表的是一个数组;
- {}大括号代表的是一个对象
- 双引号“”表示的是属性值
- 冒号:代表的是前后之间的关系,冒号前面是属性的名称,后面是属性的值,这个值可以是基本数据类型,也可以是引用数据类型。
而对于Json文件的解析,主要有以下两种方式:
- JSONObject——系统自带的解析方式解析
- Gson解析
JSONObject——系统自带的解析方式解析
要使用系统自带的解析方式的话,那么首先要熟悉JSONObject系统类中的方法:
Json文件格式:
{ "code": 200,
"msg": "OK",
"muser": [
{"name": "zhangsan","age": "10","phone": "11111","email":"11111@11.com"},
{"name": "lisi","age": "20","phone": "22222","email": "22222@22.com"},
...]
}
拿到一个Json文件,我们首先就要分析它的结构,比如上诉这个,由上面的符号标志可知,这里面包含了一个总的Object对象,然后里面有一个muser数组,数组中又有n个Object对象,因此,根据这些信息,我们可以将其解析出来:
解析代码如下:
//实体类,主要得到muser数组中的各object中的各个属性的值
public class UserBean {
//变量名跟JSON数据字段名必须一致
private String name ;
private String age;
private String phone;
private String email;
...
}
public void JsonUtil(String jsonString){
ArrayList<UserBean> userBeanList = new ArrayList<>();
try {
JSONObject jsonObject = new JSONObject(jsonString); //得到总的Object对象
int code = jsonObject.getInt("code"); //得到code的值
String msg = jsonObject.getString("msg"); //得到msg的值
JSONArray jsonArray = jsonObject.getJSONArray("muser"); // 返回json的muser数组
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject2 = jsonArray.getJSONObject(i); //得到muser数组中的各个对象
UserBean userBean = new UserBean();
userBean.setName(jsonObject2.getString("name"));
userBean.setAge(jsonObject2.getString("age"));
userBean.setPhone(jsonObject2.getString("phone"));
userBean.setEmail(jsonObject2.getString("Email"));
userBeanList.add(userBean);
}
} catch (Exception e) {
// TODO: handle exception
}
}
上诉就是使用系统自带的Json解析来解析Json文件的方法,看起来有点复杂,但是理解了的话,还是比较简单的,当然,下面的方式会更加的简单,毕竟如果官方的更好用,那么也不会有人用下面的方式了。
Gson解析
使用Gson解析的话,因为不是系统带的包,所以需要自己去下载Gson包,因此:
- 对于Eclipse的话,需要自己去网上找到对应的包。
- 对于Androidstudio的话,很简单,直接在build.gradle(注意是app的,不是project的)中依赖添加:implementation ‘com.google.code.gson:gson:2.7’,然后同步一下就可以了。
对于解析Json数据的话,Gson主要有方法Gson fromJson() ,它可以直接将一个Json文件转化成实体类,然后我们通过取出实体类的属性就实现了数据的读取。
当然有解析,那必须有转化成Json数据的方法,那就是Gson toJson()方法,它可以将你的实体类中添加的数据转换成一个Json文件,下面就将介绍这两个方法:
Gson toJson() 方法
Gson toJson() 方法那可以说是简单粗暴,不论你的实体类多么复杂,比如包含了String、int、map、list、内部类等,对于toJson方法来说,只要你把数据添加进去了,那么一句gson.toJson(“要转化的实体类”)直接满足你的要求。
比如示例数据结构定义:
public class Student {
public int id;
public String nickName;
public int age;
public ArrayList<String> books;
public HashMap<String, String> booksMap;
}
- 对于简单数据结构
Student student = new Student();
student.id = 1;
student.nickName = "Jack";
student.age = 22;
student.email = "tr@qq.com";
Gson gson = new Gson();
Log.e("MainActivity", gson.toJson(student));
打印输出:
{"email":"tr@qq.com","nickName":" Jack ","id":1,"age":22}
- 对于基本数据类型,还包含List集合
Student student = new Student();
student.id = 1;
student.nickName = " Jack ";
student.age = 22;
student.email = "965266509@qq.com";
ArrayList<String> books = new ArrayList<String>();
books.add("数学");
books.add("语文");
books.add("英语");
books.add("物理");
books.add("化学");
books.add("生物");
student.books = books;
Gson gson = new Gson();
Log.e("MainActivity", gson.toJson(student));
打印输出:
{"books":["数学","语文","英语","物理","化学","生物"],"email":"965266509@qq.com","nickName":" Jack ","id":1,"age":22}
- 对于基本数据类型,还包含了List和Map集合
Student student = new Student();
student.id = 1;
student.nickName = "Jack";
student.age = 22;
student.email = "965266509@qq.com";
ArrayList<String> books = new ArrayList<String>();
books.add("数学");
books.add("语文");
books.add("英语");
books.add("物理");
books.add("化学");
books.add("生物");
student.books = books;
HashMap<String, String> booksMap = new HashMap<String, String>();
booksMap.put("1", "数学");
booksMap.put("2", "语文");
booksMap.put("3", "英语");
booksMap.put("4", "物理");
booksMap.put("5", "化学");
booksMap.put("6", "生物");
student.booksMap = booksMap;
Gson gson = new Gson();
Log.e("MainActivity", gson.toJson(student));
打印输出:
{"books":["数学","语文","英语","物理","化学","生物"],"booksMap":{"3":"英语","2":"语文","1":"数学","6":"生物","5":"化学","4":"物理"},"email":"965266509@qq.com","nickName":"Jack","id":1,"age":22}
Gson fromJson() 方法
使用fromJson的方法对于各种不同的Json文件数据有不同的方法:
纯数组JSON
Json文件:
[ {"name": "zhangsan","age": "10","phone": "11111","email": "11111@11.com"},
{"name": "lisi","age": "20","phone": "22222","email": "22222@22.com"},
...]
解析代码如下:
//实体类
public class UserBean {
//变量名跟JSON数据字段名必须一致
private String name ;
private String age;
private String phone;
private String email;
...
}
解析方法:
public void JsonUtil(String jsonString){
ArrayList<UserBean> userBeanList = new ArrayList<>();
//Json的解析类对象
JsonParser parser = new JsonParser();
//将JSON的String 转成一个JsonArray对象
JsonArray jsonArray = parser.parse(jsonString).getAsJsonArray();
Gson gson = new Gson();
//加强for循环遍历JsonArray
for (JsonElement user : jsonArray) {
//使用GSON,直接转成Bean对象
UserBean userBean = gson.fromJson(user, UserBean.class);
userBeanList.add(userBean);
}
}
有数据头的纯数组
Json文件格式:
{"muser":
[
{"name": "zhangsan","age": "10","phone": "11111","email": "11111@11.com"},
{"name": "lisi","age": "20","phone": "22222","email": "22222@22.com"},
...]
}
解析方法:
public void JsonUtil(String jsonString){
ArrayList<UserBean> userBeanList = new ArrayList<>();
JSONObject jsonObject = new JSONObject(jsonString); //得到总的Object对象
JSONArray jsonArray = jsonObject.getJSONArray("muser"); // 返回json的muser数组
Gson gson = new Gson();
//循环遍历
for (JsonElement user : jsonArray) {
//通过反射 得到UserBean.class
UserBean userBean = gson.fromJson(user, new TypeToken<UserBean>() {}.getType());
userBeanList.add(userBean);
}
有数据头的复杂数据转换
前面的两种Json数据的解析让你看起来会觉得Gson也并没有那么方便啊,跟系统自带的方法差距也就是少点代码而以啊,说的没问题,但是Gson的简便主要在于复杂数据的解析,当然现在我们获取的数据大多都是复杂数据,因此下面你将看到Gson最大的威力。
Json文件格式:
{ "code": 200,"msg": "OK",
"muser": [{"name": "zhangsan","age": "10","phone": "11111","email":"11111@11.com"},
{"name": "lisi","age": "20","phone": "22222","email": "22222@22.com"},
...]
}
被解析对象不是纯数组数据,还有其它字段+数组(含头),方法如下:
根据 JSON 建立Bean,注意这里的 Bean 是返回所有字段,因为 GSON 能直接解析成 List ,所以 Bean可以这样定义,(get/set方法省略):
public class ResultBean {
//注意变量名与字段名必须一致
private int code;
private String msg;
private List<UserBean> muser;
public class UserBean{
private String name ;
private String age;
private String phone;
private String email;
...
}
...
}
有消息头复杂数据的解析方法如下:
public void JsonUtil(String jsonString){
ResultBean resultBean = new Gson().fromJson(jsonString,ResultBean.class);
//对象中拿到集合
int code = resultBean.getCode(); //得到code的值
String msg = resultBean.getMsg(); //得到msg的值
List<ResultBean.UserBean> userBeanList = resultBean.getMuser();
}
四句话搞定得到所有的值,由此看出GSON的强大。这种方法也是我们最常用的方法,而且在Androidstudio中有个GsonFormat插件,它能帮助你将Json数据直接转化成实体类,可以说是十分的方便,当然对于实在是复杂的数据,建议还是多定义几个实体类,不然一个实体类会很臃肿。