背景:
提交(获取)服务器数据时,经常遇到json实体中某些字段不需要序列化(反序列化)提交(获取)到服务器(本地)。怎么办?Gson工具类实际已通过注解方式帮助我们实现了该需求,现进一步说明如下:
使用:
非动态忽略字段
1.使用注解:@Export
2.使用方法:new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()
3.案例:
3.1.创建实体类
public class LoggedInUserDto {
@Expose(serialize = false)
private String userId;
@Expose(deserialize = false)
private String displayName;
@Expose()
private String displayCode;
public LoggedInUserDto(String userId, String displayName, String displayCode) {
this.userId = userId;
this.displayName = displayName;
this.displayCode = displayCode;
}
public String getUserId() {
return userId;
}
public String getDisplayName() {
return displayName;
}
public String getDisplayCode() {
return displayCode;
}
@NonNull
@Override
public String toString() {
return userId + "---" + displayName+ "---" + displayCode;
}
}
3.2.使用GsonBuilder创建Gson实例
Gson sGson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
//序列化:sGson.toJson(loggedInUserDto); 不会输出字段 userId
LoggedInUserDto loggedInUserDto = new LoggedInUserDto("8888","中控","supcon");
Log.d("------序列化---------",sGson.toJson(loggedInUserDto));
//反序列化:sGson.fromJson(gsonStr,LoggedInUserDto.class); 不会输出字段 displayName
String gsonStr = "{\"userId\": 8888 ,\"displayCode\":\"supcon\",\"displayName\":\"中控\"}";
Log.d("------反序列化---------",sGson.fromJson(gsonStr,LoggedInUserDto.class));
动态忽略字段(特别是继承父类中的字段)
Gson mGson = new GsonBuilder().setExclusionStrategies(new ExclusionStrategy() {
@Override
public boolean shouldSkipField(FieldAttributes f) {
// 忽略某些字段
return f.getName().equals("field1") || f.getName().equals("field2");
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
// 忽略某个class
return false;
}
}).create();