Android json数据解析之Gson和FastJson的应用
一:Gson应用
Gson是谷歌提供的一个开源库,能够用来解析JSON数据。
1.什么是json
json就是用来进行网络数据传输的一种格局,目前的应用很宽泛,其格局就是一种键值对的模式,很不便进行解析。json有Json对象(JsonObject)和Json数组(JsonArray)两种模式。但凡以{}就是一个Json对象,但凡[]就是一个Json数组。
{//一个Json对象 "user": "user1", "pwd": "123456" }
{//这个对象有4个字段,其中一个是数组 "user": "user1", "pwd": "123456", "jsonArray": [//一个Json数组外面有2个Json对象,每个Json对象有2个字段 {"user": "user1", "pwd": "123456"}, {"user": "user2", "pwd": "123456"} ], "result": "胜利" }
2.增加Gson依赖
这是github上19.1kStar我的项目
在app下build.gradle增加依赖
implementation ‘com.google.code.gson:gson:2.8.6’
3.应用GsonFormat工具
Gson是采纳对象映射的形式,所有要为JSON数据创立一个Java对象来与之对应。
1.装置GsonFormat插件
2.新建一个类,在类外面按Alt+S键,并将要转换的Json数据复制进去
4.Gson应用
public class User implements Serializable { /** * user : user1 * pwd : 123456 * jsonArray : [{"user":"user1","pwd":"123456"},{"user":"user2","pwd":"123456"}] * result : 胜利 */ private String user; private String pwd; private String result; private List<JsonArrayBean> jsonArray; public static class JsonArrayBean implements Serializable { /** * user : user1 * pwd : 123456 */ 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; } } 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; } }
解析JSON对象
String jsonData="要解析的Json字符串"; Gson gson=new Gson(); User user=gson.fromJson(jsonData, User.class); String result=user.getResult(); Log.d("aa",result); =========== aa: 胜利
解析Json对象外面的数组
// 因为jsonArray字段对应的是一个JSON数组,所以要用一个List来对应 List<User.JsonArrayBean> jsonArrayBeans=user.getJsonArray(); //取值 for (int i=0;i<jsonArrayBeans.size();i++){ User.JsonArrayBean jsonArrayBean=jsonArrayBeans.get(i); String u=jsonArrayBean.getUser(); Log.d("bb",u); ================ 取到的值 bb: user1 bb: user2
解析纯数组
[ {"user": "user8", "pwd": "123456"}, {"user": "user9", "pwd": "123456"} ] //应用形式 Gson gson=new Gson(); List<Data> datas=gson.fromJson(jsonData, new TypeToken<ArrayList<Data>>(){}.getType()); for (int i=0;i<datas.size();i++){ Data data=datas.get(i); String u=data.getUser(); Log.d("cc",u); } //打印后果 cc: user8 cc: user9
序列化对象成Json(Teacher对象下4个属性 age,email,isDeveloper,name)
Gson gson=new Gson(); Teacher teacher=new Teacher("Rocky","[email protected]",22,true); String teacherJson=gson.toJson(teacher); Log.d("bb",teacherJson); 打印后果 bb {"age":22,"email":"[email protected]","isDeveloper":true,"name":"Rocky"}
如果变量为空值的话序列化和反序列化
1.可见某个变量为null时,Gson在序列化的时候间接把这个变量疏忽了
2.对于JSON字符串里没有的变量,Gson在反序列化时会给它一个默认值,int类型默认为0,bool类型默认为false,String类型默认为null
Gson gson=new Gson(); Teacher teacher=new Teacher("Rocky",null,22,true); String teacherJson=gson.toJson(teacher); Log.d("bb",teacherJson);
管制序列化/反序列化的变量名称
以Teacher对象为例,如果JSON字符串的变量名name变成fullName,无需缓和,咱们也不必把Teacher对象的变量name改成fullName,而后把get,set办法全改了。只须要用Gson提供的注解@SerializedName就行。
public class Teacher{ @SerializedName("fullName") //@SerializedName(value = "name", alternate = "fullName") //然而事实远比设想中简单,这个JSON有时候传的是`fullName`,有时候传的是`name`,这时该怎么办呢? 不必放心,`@SerializedName` 承受两个参数,`value` 和 `alternate` ,顾名思义,`alternate` 是备选变量名 private String name; private String email; private int age; private boolean isDeveloper; } 打印Json后果 {"age":22,"isDeveloper":true,"fullName":"Rocky"}
序列化/反序列化过程中疏忽某些变量
public class Teacher { @SerializedName("fullName") private String name; private String email; //@Expose()参加序列化和反序列化 //@Expose(serialize = false)不参加序列化,只参加反序列化 // @Expose(deserialize = false)只参加序列化,不参加反序列化 @Expose(serialize = false,deserialize = false)//序列化和反序列化都不参加 private int age; private boolean isDeveloper; }
然而:要应用这个注解来管制序列化和反序列化,就不能应用默认的Gson对象
//Gson gson=new Gson();不能通过这种形式构建Gson对象 GsonBuilder builder=new GsonBuilder(); builder.excludeFieldsWithoutExposeAnnotation(); //builder.setPrettyPrinting(); Gson gson=builder.create(); Teacher teacher=new Teacher("Rocky","[email protected]",22,true); String teacherJson=gson.toJson(teacher); Log.d("bb",teacherJson); 打印后果 bb: {} 我不晓得为什么这种形式呈现的后果是空,按理说我只是限定一个属性的序列化形式依照网上说的形式构建的Gson也不能 我把builder.excludeFieldsWithoutExposeAnnotation();换成builder.setPrettyPrinting();能够打印进去 然而没有限度字段的序列化和反序列化 形式二:transient字段 通过private transient int age; Gson gson=new Gson(); Teacher teacher=new Teacher("Rocky","[email protected]",22,true); String teacherJson=gson.toJson(teacher); Log.d("bb",teacherJson); 打印后果 {"email":"[email protected]","isDeveloper":true,"fullName":"Rocky"}
二:FastJson应用
FastJson是一个Java语言的编写的高性能的Json处理器,由阿里巴巴公司开发的,github上23kStar
1.增加依赖
implementation ‘com.alibaba:fastjson:1.2.73’
2.序列化Json,把对象转成Json串调用JSON.toJSONString
tudent student=new Student("Mike",12); String studentJson =JSON.toJSONString(student,true);//为true就是要格式化Json,flase就是非格式化Json //Gson的builder.setPrettyPrinting();格式化Json Log.d("aa",studentJson); 打印后果: aa: { "age":12, "name":"Mike" }
3.反序列化Json,把Json串转成对象JSON.parseObject
String json = "{"age":18, "name":"Rocky"}"; Student student=JSON.parseObject(json,Student.class);//要记得Student 增加一个无参的构造方法 Log.d("bb",student.getName()); Log.d("bb",student.getAge()+""); 打印后果 bb: Rocky bb: 18
如果没有无参的构造方法会报谬误
Json转成简单的Bean,如List ,Set,Map
public class Student { private String name; private int age; ....疏忽get,set办法 } 一:List形式 String json = "[{"age":18, "name":"Rocky"},{"age":19, "name":"jack"}]"; List<Student> lists=JSON.parseObject(json,new TypeReference<ArrayList<Student>>(){}); for (int i=0;i<lists.size();i++){ Student student=lists.get(i); Log.d("cc",student.getName()); Log.d("cc",student.getAge()+""); } 二:Set形式 String json = "[{"age":18, "name":"Rocky"},{"age":19, "name":"jack"}]"; Set<Student> lists=JSON.parseObject(json,new TypeReference<HashSet<Student>>(){}); for (Student student:lists){ Log.d("cc",student.getName()); Log.d("cc",student.getAge()+""); } 打印后果 cc: Rocky cc: 18 cc: jack cc: 19
@JSONField注解的应用
1.作用于get办法上:当把注解作用于get办法上的时候,在把Java对象转化成Json字符串的时候,Java对象中的字段名会转化为注解中的name指定的字段名。
@JSONField(name = "myAge") public int getAge() { return age; } Student student=new Student(); student.setAge(15); student.setName("Rock"); String studentJson =JSON.toJSONString(student,true); Log.d("aa",studentJson); 打印后果 aa: { "myAge":15,//变成咱们正文的属性名 "name":"Rock" }
2 作用于set办法上:在把json字符串转化成java对象的时候,注解中的name指定的字段名会映射为Java对象中的字段名。
@JSONField(name = "myName") public void setName(String name) { this.name = name; } String json = "{"age":2,"myName":"ss"}";//这个Json串的属性换成标记的 Student student= JSON.parseObject(json,Student.class); Log.d("cc",student.getName()); Log.d("cc",student.getAge()+""); 打印后果 cc: ss cc: 2
3 @JSONField作用于java类的字段上
public class Student { @JSONField(name = "name", alternateNames = {"myName", "meName"}) private String name; private int age; } String json = "{"age":2,"meName":"ss"}";//这个name字段能够是myName,也能够是meName都能够映射到name字段上 Student student= JSON.parseObject(json,Student.class); Log.d("cc",student.getName()); Log.d("cc",student.getAge()+""); 打印后果 cc: ss cc: 2
Java Bean对象与JSONObject 对象互相转换
Java Bean对象—>JSONObject对象—>json字符串
student.setAge(15); student.setName("Rock"); JSONObject jsonObject= (JSONObject) JSON.toJSON(student);//JSONObject对象 String studentJson= jsonObject.toJSONString();//转成Json字符串,toString()也能够 Log.d("aa",studentJson);
json字符串与JSONObject对象转换
json字符串—>JSONObject对象
String json = "{"age":2,"meName":"ss"}"; JSONObject studentObject= JSON.parseObject(json);
json字符串转成Java汇合能够间接应用JSON.parseArray()
String json = "[{"age":18, "name":"Rocky"},{"age":19, "name":"jack"}]"; List<Student> lists=JSON.parseArray(json,Student.class); for (Student student:lists){ Log.d("cc",student.getName()); Log.d("cc",student.getAge()+""); }
END:所求皆吾愿,所行化坦途