Gson的使用

简介

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 stringList = gson.fromJson(jsonArray, new TypeToken>() {
}.getType());

生成JSON数据:

//List 转为 Json数组
jsonArray = gson.toJson(stringList, new TypeToken>() {
}.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();

你可能感兴趣的:(其他)