有这样的需求:
UserModel user = new UserModel();
user.age=5;
user.name = "tom";
user.firstName = "";
要求user
对象 序列化 json 为 {"age":5}
,序列化忽略某些字段,并且空串""
不输出。
@Test
public void testGson() {
Gson gson = new GsonBuilder()
//序列化 null
.addSerializationExclusionStrategy(new ExclusionStrategy() {
@Override
public boolean shouldSkipField(FieldAttributes f) {
//排除加 @Exclude 注解的字段,return true为排除
Exclude expose = f.getAnnotation(Exclude.class);
return expose != null;
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return false;
}
})
.registerTypeAdapter(String.class, new JsonSerializer<String>() {
@Override
public JsonElement serialize(String src, Type typeOfSrc, JsonSerializationContext context) {
//将"" 序列化为 null
return TextUtils.isEmpty(src) ? JsonNull.INSTANCE : new JsonPrimitive(src);
}
})
.create();
UserModel userModel = new UserModel();
userModel.age = 5;
userModel.name = "tom";
userModel.firstName = "";
System.out.println(gson.toJson(userModel));
}
public class UserModel {
@Exclude
public String name;
public int age;
public String firstName;
}
@Retention(RetentionPolicy.RUNTIME)
@Target(FIELD)
public @interface Exclude {
}
输出
{"age":5}
为什么会有这样的需求,有些时候页面上面需要一些字段,譬如这里的name
字段,但是发送给接口的参数又不需要这些字段,这就需要我们序列化时忽略它们。至于 ""
不输出是接口的要求,更简洁。