简介
Gson是Google出品的Json解析函数库,可以将JSON字符串反序列化为对应的Java对象,或者反过来将Java对象序列化为对应的字符串,免去了开发者手动通过JSONObject和JSONArray将Json字段逐个进行解析的烦恼,也减少了出错的可能性,增强了代码的质量。
Gson引入以及创建
Gradle中引入:
implementation 'com.google.code.gson:gson:2.8.6'
Gson对象创建:
//通过构造函数来获取
Gson gson = new Gson();
//通过 GsonBuilder 来获取,可以进行多项特殊配置
Gson gson = new GsonBuilder().create();
生成JSON
通过创建JsonObject对象,调用addProperty方法,可以再Json中加入属性。
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("String", "leavesC");
jsonObject.addProperty("Number_Integer", 23);
jsonObject.addProperty("Number_Double", 22.9);
jsonObject.addProperty("Boolean", true);
jsonObject.addProperty("Char", 'c');
生成的JSON:
基本类型解析
基本类型数据的解析:
Gson gson = new Gson();
int i = gson.fromJson("100", int.class); //100
double d = gson.fromJson("\"99.99\"", double.class); //99.99
boolean b = gson.fromJson("true", boolean.class); // true
String str = gson.fromJson("String", String.class); // String
基本类型数据的生成:
Gson gson = new Gson();
String jsonNumber = gson.toJson(100); // 100
String jsonBoolean = gson.toJson(false); // false
String jsonString = gson.toJson("String"); //"String"
POJO解析
POJO类:
public class User {
public String name;
public int age;
//其他省略
}
解析成类对象:
Gson gson = new Gson();
String jsonString = "{\"name\":\"张三\",\"age\":24}";
User user = gson.fromJson(jsonString, User.class);
生产JSON字符串:
Gson gson = new Gson();
User user = new User("张三",24);
String jsonObject = gson.toJson(user); //结果为 {"name":"张三kidou","age":24}
Array
解析成数组:
Gson gson = new Gson();
String jsonArray = "[\"https://github.com/leavesC\",\"https://www.jianshu.com/u/9df45b87cfdf\",\"Java\",\"Kotlin\",\"Git\",\"GitHub\"]";
String[] strings = gson.fromJson(jsonArray, String[].class);
生成JSON数据:
jsonArray = gson.toJson(strings, String[].class);
List
解析成为LIST:
Gson gson = new Gson();
String jsonArray = "[\"https://github.com/leavesC\",\"https://www.jianshu.com/u/9df45b87cfdf\",\"Java\",\"Kotlin\",\"Git\",\"GitHub\"]";
List<String> stringList = gson.fromJson(jsonArray, new TypeToken<List<String>>() {
}.getType());
生成JSON数据:
//List 转为 Json数组
jsonArray = gson.toJson(stringList, new TypeToken<List<String>>() {
}.getType());
属性重命名@SerializedName 注解
假如,我们想要像以下一样的数据:
{"name":"leavesC","age":24,"sex":true}
而实际得到的数据为:
{"userName":"leavesC","age":24,"sex":true}
这时候,由于name与userName,会导致解析之后name字段的值为null。为了兼顾这种不同名的数据,就需要使用 @SerializedName 注解。
再对应POJO类的相应属性上加上给注解,并且指明对应别名,就可以完成数据的接收。
public class User {
@SerializedName("userName")
private String name;
private int age;
private boolean sex;
}
使用注解的alternate属性,可以声明更多的别名。
@SerializedName(value = "userName", alternate = {"user_name", "Name"})
再添加了上面的注解之后,以下数据都可以正常解析:
String userJson = "{\"userName\":\"leavesC\",\"age\":24,\"sex\":true}";
User user = gson.fromJson(userJson, User.class);
userJson = "{\"user_name\":\"leavesC\",\"age\":24,\"sex\":true}";
user = gson.fromJson(userJson, User.class);
userJson = "{\"Name\":\"leavesC\",\"age\":24,\"sex\":true}";
user = gson.fromJson(userJson, User.class);
字段过滤
字段过滤有两个方向,一个是解析时,另一个则是生成时。
因此@Expose注解有两个属性,serialize
的值表示该属性是否参加序列化,deserialize的值表示该属性是否参加反序列化。如果字段不声明 Expose 注解,则意味着不进行序列化和反序列化操作,相当于两个属性值均为 false 。
例如:
@Expose(serialize = true, deserialize = true) //序列化和反序列化都生效
@Expose(serialize = false, deserialize = true) //序列化时不生效,反序列化时生效
@Expose(serialize = true, deserialize = false) //序列化时生效,反序列化时不生效
@Expose(serialize = false, deserialize = false) //序列化和反序列化都不生效,和不写注解一样
此外,Expose 注解需要和 GsonBuilder 构建的 Gson 对象一起使用才能生效。
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();