数据解析_Gson
程序员文章站
2022-06-25 12:00:45
简单使用//反序列化new Gson().fromJson("", Object.class);//序列化new Gson().toJson(Object);在序列化和反序列化时,是用JsonReader和JsonWriter 来实现的,这边可以自己使用它们来手写具体是在类的上面加上注解@JsonAdapter(自定义的TypeAdapter.class) ,然后直接new Gson即可。也可以通过GsonBuilder的registerTypeAdapter来设置一个TypeAdapter...
简单使用
//反序列化
new Gson().fromJson("", Object.class);
//序列化
new Gson().toJson(Object);
在序列化和反序列化时,是用JsonReader和JsonWriter 来实现的,这边可以自己使用它们来手写
具体是在类的上面加上注解@JsonAdapter(自定义的TypeAdapter.class) ,然后直接new Gson即可。
也可以通过GsonBuilder的registerTypeAdapter来设置一个TypeAdapter,在自定义的TypeAdapter的write和read方法中实现自己想要的序列化和反序列化代码,如果只想接管其中某个过程可以将TypeAdapter换成JsonSerializer(序列化)与JsonDeserializer(反序列化)
如果想要将整数转成字符串,用registerTypeAdapter需要多次调用,可以使用registerTypeHierarchyAdapter,type传Number.class
属性名称修改或者冲突
为了避免属性值变更可以使用@SerializedName(value = "别名1", alternate = {"别名2", "别名3"})
alternate为可选
泛型传class
如果Object.class是泛型则会出现问题,无法解析
比如List<String> 这个传入List<String>.class 只会被当成List.class
解决方式是:new Gson().fromJson("", new TypeToken<List<String>>() {}.getType()));
这个对于android接口返回数据处理很有用
{
"code":"0",
"msg" : "success",
"data":
}
这边的data是各种各样的,所以可以直接使用泛型,在fromJson的时候使用TypeToken来传
public class Result<T> {
public int code;
public String message;
public T data;
}
其他异常场景处理
- 当某个对象的某个属性为null,在tojson时这个属性会消失
这时使用GsonBuilder可以设置序列化时的要求,.serializeNulls()可以完整输出该属性并且值为null
Gson gson = new GsonBuilder()
//序列化null
.serializeNulls()
// 设置日期时间格式,另有2个重载方法
// 在序列化和反序化时均生效
.setDateFormat("yyyy-MM-dd")
// 禁此序列化内部类
.disableInnerClassSerialization()
//生成不可执行的Json(多了 )]}' 这4个字符)
.generateNonExecutableJson()
//禁止转义html标签
.disableHtmlEscaping()
//格式化输出
.setPrettyPrinting()
.create();
-
当类的某个属性不需要序列化或者反序列化时可以使用@Expose注解
@Expose(deserialize = true,serialize = true) //序列化和反序列化都都生效,等价于上一条
@Expose(deserialize = true,serialize = false) //反序列化时生效
@Expose(deserialize = false,serialize = true) //序列化时生效
@Expose(deserialize = false,serialize = false) // 和不写注解一样这时不能new Gson,应该用
Gson gson = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation()
.create();
-
类在不同版本时拥有的属性可能不一样,这时可以使用注解@Since(double)和@Until(double)来表明属性可以被序列化或反序列化的版本
版本通过GsonBuilder的.setVersion(Double)来设置 -
类中某种修饰符不想被序列化或者反序列化时可以使用GsonBuilder的excludeFieldsWithModifiers来排除
new GsonBuilder()
.excludeFieldsWithModifiers(Modifier.FINAL, Modifier.STATIC, Modifier.PRIVATE)
.create();
不会序列化或者反序列化,final、static、private修饰的属性
自定义排除类型addSerializationExclusionStrategy添加序列化排除属性,addDeserializationExclusionStrategy 添加反序列化排除属性
Gson gson = new GsonBuilder()
.addSerializationExclusionStrategy(new ExclusionStrategy() {
@Override
public boolean shouldSkipField(FieldAttributes f) {
// 这里作判断,决定要不要排除该字段,return true为排除
if ("finalField".equals(f.getName())) return true; //按字段名排除
Expose expose = f.getAnnotation(Expose.class);
if (expose != null && expose.deserialize() == false) return true; //按注解排除
return false;
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
// 直接排除某个类 ,return true为排除
return (clazz == int.class || clazz == Integer.class);
}
})
.create();
本文地址:https://blog.csdn.net/qq_37658380/article/details/107462113