1、如何创建
使用 new 关键字直接创建:Gson gson = new Gson()
由 GsonBuilder 对象构建:Gson gson = new GsonBuilder().create()
两种创建方式在进行序列化与反序列操作时行为都是一样的,但GsonBuilder创建的Gson允许进行额外的行为定制。
GsonBuilder设置
方法名 | 描述 |
---|---|
setVersion(double) | 指明版本号时有效,设置后只会解析对象中对应版本的字段 |
excludeFieldsWithModifiers(int… modifiers) | 排除带指定修饰符的字段(Modifier.STATIC) |
generateNonExecutableJson | 使用 |
excludeFieldsWithoutExposeAnnotation | 只解析带有@Expose注解的字段 |
serializeNulls | 可解析出null的字段,输出的字符串为紧凑型 |
enableComplexMapKeySerialization | 启用复杂映射键序列化 |
disableInnerClassSerialization | 禁用内部类序列化 |
setLongSerializationPolicy(LongSerializationPolicy) | 设置Long类型序列化策略 |
setFieldNamingPolicy(FieldNamingPolicy) | 设置字段命名策略 |
setExclusionStrategies(ExclusionStrategy) | 设置排除策略,与transient和@Expose更高级 |
addSerializationExclusionStrategy(ExclusionStrategy) | 添加序列化排除策略 |
addDeserializationExclusionStrategy | 添加反序列化排除策略 |
setPrettyPrinting | 美化打印格式 |
setLenient | 设置后忽略一些不标准的 JSON 数据格式也可反序列化 |
disableHtmlEscaping | 禁用HTML转义 |
setDateFormat | 设置日期如何格式化 |
registerTypeAdapter(Type type, Object typeAdapter) | 注册类型适配器,需自定义一个类型适配器 |
2、对象转字符串
public String toJson(Object src)
直接调用即可
Gson gson = new GsonBuilder().create();
UserRequest userRequest = new UserRequest();
userRequest.setAge(1);
userRequest.setName("name");
String userGson = gson.toJson(userRequest);
System.out.println(userGson);
输出:{“name”:“name”,“age”:1}
3、字符串转对象
3.1、转普通对象
UserRequest userRequest1 = gson.fromJson(userGson, userRequest.getClass());
System.out.println(userRequest1);
输出:UserRequest(name=name, age=1)
3.2、转list、map、复杂对象
List<UserRequest> userRequests = new ArrayList<>();
userRequests.add(userRequest);
System.out.println("先将list对象转为string:"+gson.toJson(userRequests));
List list = gson.fromJson(gson.toJson(userRequests), List.class);
System.out.println(list);
输出:
先将list对象转为string:[{“name”:“name”,“age”:1}]
[{name=name, age=1.0}]
注意: age从1变为了1.0。
原因: json字符串反序列化为对象(针对单层级的对象)Gson 自定义集合LinkedTreeMap ,它实现Map 接口了,存储键值对,在新增和删除上实现上进行了优化,并且将存储键值对的顺序作为遍历顺序,也就是先存入的先被遍历到。除此之外,JSON 字符串里的数值型数据都会转转换为 Double 类型, 而 true/false 数据被会被转换成 Boolean 类型。
解决方法:
public T fromJson(String json, Class classOfT)
public T fromJson(String json, Type typeOfT)
fromJson方法第二个参数除了传Class外,还可传Type:
List<UserRequest> userRequests = new ArrayList<>();
userRequests.add(userRequest);
System.out.println("先将list对象转为string:"+gson.toJson(userRequests));
Type type = new TypeToken<List<UserRequest>>() {
}.getType();
List<UserRequest> list = gson.fromJson(gson.toJson(userRequests), type);
System.out.println(list);
输出:
先将list对象转为string:[{“name”:“name”,“age”:1}]
[UserRequest(name=name, age=1)]
4、注解
注解名 | 描述 |
---|---|
@Expose | 与excludeFieldsWithoutExposeAnnotation联合使用,可设置是否序列化和反序列化 eg:字段上加注解@Expose(serialize = true,deserialize = true) |
@SerializedName | 定义序列名称 |
@Since | 版本号,可GsonBuilder中定制setVersion,即指定版本号后启用 |
@Until | 与@since类似,相反语义,即指定版本号后弃用 |
@JsonAdapter | 使用指定的自定义转化方式 |