千家信息网

Gson序列化指定忽略字段的三种写法是什么

发表于:2024-11-11 作者:千家信息网编辑
千家信息网最后更新 2024年11月11日,这篇文章主要讲解了"Gson序列化指定忽略字段的三种写法是什么",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Gson序列化指定忽略字段的三种写法是什么
千家信息网最后更新 2024年11月11日Gson序列化指定忽略字段的三种写法是什么

这篇文章主要讲解了"Gson序列化指定忽略字段的三种写法是什么",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Gson序列化指定忽略字段的三种写法是什么"吧!

目录
  • 1. transient关键字

  • 2. expose注解

  • 3. 自定义排查策略ExclusionStrategy

在我们日常使用json序列化框架过程中,经常会遇到在输出json字符串时,忽略某些字段,那么在Gson框架中,要想实现这种方式,可以怎么处理呢?

1. transient关键字

最容易想到的case,就是直接借助jdk的transient关键字来修饰不希望输出的对象,如

@Data@AllArgsConstructor@NoArgsConstructorpublic static class GItem {    private String user;    // @IgnoreField    private transient String pwd;}

上面的对象中,pwd前面使用transient进行修饰,那么在输出json串时,默认会忽略
@Test

public void testPrint() {    GItem item = new GItem("一灰灰", "yihui");    String ans = new Gson().toJson(item);    System.out.println(ans);}

输出如

{"user":"一灰灰"}

2. expose注解

借助gson提供的expose注解,也可以实现上面的case,如在需要保留的字段上添加@Expose

@Data@AllArgsConstructor@NoArgsConstructorpublic static class GItem {    @Expose    private String user;    // @IgnoreField    private String pwd;}

然后我们使用的地方,注意通过 GsonBuilder来创建Gson对象

@Testpublic void testPrint() {    GItem item = new GItem("一灰灰", "yihui");    String ans = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create().toJson(item);    System.out.println(ans);}

上面这种使用姿势感觉有点怪怪的,在需要保留的字段上添加注解,这种使用方式并没有jackson的@JsonIgnore方式来得方便

3. 自定义排查策略ExclusionStrategy

除了上面两种方式之外,通过自定义的排除策略可以实现即使不修改bean,也能指定哪些字段不序列化
一个简单的demo如下,如果包含自定义的注解,则不序列化,或者field_name == pwd也不序列化

@Target({ElementType.ANNOTATION_TYPE, ElementType.FIELD, ElementType.TYPE})    @Retention(RetentionPolicy.RUNTIME)    @Documented    public @interface IgnoreField {}@Testpublic void testExclude() {    Gson gson = new GsonBuilder().setExclusionStrategies(new ExclusionStrategy() {        @Override        public boolean shouldSkipField(FieldAttributes fieldAttributes) {            if (fieldAttributes.getAnnotation(IgnoreField.class) != null) {                // 包含这个注解的,直接忽略                return true;            }            // 成员白名单            if (fieldAttributes.getName().equalsIgnoreCase("pwd")) {                return true;            }            return false;        }        @Override        public boolean shouldSkipClass(Class aClass) {            if (aClass.isAnnotationPresent(IgnoreField.class)) {                return true;            }            return false;        }    }).registerTypeAdapterFactory(new MyMapTypeAdapterFactory(new ConstructorConstructor(new HashMap<>()), false)).create();    GItem item = new GItem();    item.setUser("一灰灰");    item.setPwd("123456");    System.out.println(gson.toJson(item));}

上面这种姿势,更适用于有自定义需求场景的case,那么问题来了,如果我希望序列化的对象,并不是JOPO对象,比如传入的是一个Map,也希望针对某些key进行忽略,可以怎么整呢?

感谢各位的阅读,以上就是"Gson序列化指定忽略字段的三种写法是什么"的内容了,经过本文的学习后,相信大家对Gson序列化指定忽略字段的三种写法是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

0