Gson 使用技巧

有这样的需求:

        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() {
                    @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字段,但是发送给接口的参数又不需要这些字段,这就需要我们序列化时忽略它们。至于 ""不输出是接口的要求,更简洁。

你可能感兴趣的:(Gson 使用技巧)