【笔记】Gson学习笔记

前言

使用Google提供的Gson,将JSON格式的字符串转换为Java实体类对象

项目主页

引入依赖

build.gradle

1
2
3
4
5
6
dependencies {

...

implementation 'com.google.code.gson:gson:2.8.6'
}

创建实体类

  • 创建一个pojo实体类,添加Get/Set方法
1
2
3
4
5
public class Responce {

...

}

创建Gson对象

1
Gson gson = new Gson();

Java对象序列化/反序列化

将Java对象转化成JSON格式字符串

<obj>:Java实体类对象

1
String json = gson.toJson(<obj>);

将Json格式字符串转化成Java对象

json:json格式的字符串
Object.class:实体类

1
Object obj = gson.fromJson(json, Object.class);

Java数组序列化/反序列化

将Java数组转化成JSON格式字符串

<arr>:Java数组

1
String json = gson.toJson(<arr>);

将Json格式字符串转化成Java对象

json:json格式的字符串
Object[].class:Java数组类型

1
Object obj = gson.fromJson(json, Object[].class);

Java List集合序列化/反序列化

将Java集合转化成JSON格式字符串

<list>:Java集合

1
String json = gson.toJson(<list>);

将Json格式字符串转化成Java集合

json:json格式的字符串
type:使用Gson提供的Type类定义泛型

1
2
Type type = new TypeToken<List<Object>>() {}.getType();
List<Object> list = gson.fromJson(json, type);

Java Map集合序列化/反序列化

将Java集合转化成JSON格式字符串

<map>:Java集合

1
String json = gson.toJson(<map>);

将Json格式字符串转化成Java集合

json:json格式的字符串
type:使用Gson提供的Type类定义泛型

1
2
Type type = new TypeToken<Map<String, Object>>() {}.getType();
Map<String, Object> map = gson.fromJson(json, type);

Java Map集合序列化/反序列化

将Java集合转化成JSON格式字符串

<set>:Java集合

1
String json = gson.toJson(<set>);

将Json格式字符串转化成Java集合

json:json格式的字符串
type:使用Gson提供的Type类定义泛型

1
2
Type type = new TypeToken<Set<Object>>() {}.getType();
Set<Object> set = gson.fromJson(json, type);
  • 如果想要得到的是HashSet类型,则完全可以直接得到List类型,因为两者序列化后的JSON格式字符串完全相同
1
2
Type type = new TypeToken<List<Object>>() {}.getType();
List<Object> set = gson.fromJson(json, type);

控制字段的命名

  • 当JSON的key中出现Java保留字时,可以使用@SerializedName("")注解指定key

public:key

1
2
@SerializedName("public")
String p;

控制字段是否参与序列化

  • 可以使用@Expose注解控制字段是否参与序列化与反序列化

serialize = true:是否参与序列化
deserialize = true:是否参与反序列化

1
@Expose(serialize = true, deserialize = true)
  • 为了使@Expose注解生效,创建Gson对象时需要使用GsonBuilder()创建
1
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();

参与序列化与反序列化

  • 指定无参的@Expose注解,等同于不指定@Expose注解,表示参与序列化与反序列化
1
@Expose

不参与序列化与反序列化

  • 使用transient关键字定义的字段,等同于@Expose(serialize = false, deserialize = false),表示不参与序列化与反序列化
1
transient String p;

完成

参考文献

哔哩哔哩——Android架构解析