Android网络数据解析之Gson
一、Gson解析框架
Gson由谷歌研发,可以把Java对象转成Json,也可以把Json字符串转换成一个相等的Java对象。Gson支持任意复杂Java对象包括没有源代码的对象。
注:
Gson序列化的时候,如果对象的某个字段为null,是不会输出到Json中的。
Gson反序列化的时候,如果某个字段在Json中找不到对应的值,就会被赋值为null。
不会被序列化和反序列化字段:transient、synthetic、内部类的某个字段和外部类的某个字段一样。
二、Gson基本用法
在build.gradle中配置:compile ‘com.google.code.gson:gson:2.4’
Gson提供了fromJson()和toJson()两个直接用于解析和生成的方法,fromJson()实现反序列化,toJson()实现序列化。同时每个方法都提供了重载方法。
1. 基本数据类型的解析
Gson gson = new Gson(); 注:double:不论99.99还是“99.99”,都会解析成double类型的99.99 |
2. 基本数据类型的生成
String jsonInt = gson.toJson(100); |
3. POJO类的生成与解析
POJO类:成员变量名就是Json的key值 public class TestPerson { |
生成JSON
//POJO数据类型的生成 |
解析JSON
//POJO数据类型的解析 |
4. 属性重命名@SerializedName
Json数据命名习惯不同 1)期望Json {"name":"张三","age":20,"emailAddress":"1599863094@qq.com"} 2)实际Json {"name":"张三","age":20,"email_address":"1599863094@qq.com"} 如何兼容两种不同的命名习惯?在POJO类中 @SerializedName("email_address") public String emailAddress; Json数据命名习惯不同,多种key命名 1)期望Json {"name":"张三","age":20,"emailAddress":"1599863094@qq.com"} 2)实际第一种Json {"name":"张三","age":20,"email_address":"1599863094@qq.com"} 3)实际第二种Json {"name":"张三","age":20,"email":"1599863094@qq.com"} 如何兼容上面多种key命名:alternate接收一个String数组 @SerializedName(value = "email_address",alternate = {"email_address","email"}) public String emailAddress; 当上面的key(emailAddress、email_address、email)出现任何一个时都可以获取其对应的value值,当多种情况同时出现,以最后一个出现的值为准,如下 {"name":"张三","age":20,"emailAddress":"001@qq.com","email_address":"002@qq.com","email":"003@qq.com"} 获取的结果:emailAddress = 003@qq.com; |
5. 数组两种解析方式
1)使用数组解析
Gson gson = new Gson(); String jsonArray = "[\"Android\",\"Java\",\"PHP\"]"; |
JSON字符串数组,使用List解析,直接将String[].class改为List<String>.class是不行的。对于Java来说List<String>和List<TestPerson>这两个字节码文件都是List.class,这是Java泛型使用时要注意的“泛型擦除”。
当我们希望将Json字符串数组使用List<String>解析(List对于增删都是比较方便)
2)使用List解析
Gson gson = new Gson(); String jsonArray = "[\"Android\",\"Java\",\"PHP\"]"; gson.fromJson(jsonArray, new TypeToken<List<String>>() {}.getType()); |
注:TypeToken的构造方法是protected修饰的,所以上面才会写成
new TypeToken<List<String>>(){}.getType
而不是new TypeToken<List<String>>().getType