Gson序列化指定忽略字段的三种写法详解

 更新时间:2021年10月26日 10:14:55   作者:一灰灰  
在我们日常使用json序列化框架过程中,经常会遇到在输出json字符串时,忽略某些字段,那么在Gson框架中,要想实现这种方式,可以怎么处理呢,本文就来介绍一下

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

本文介绍几种常见的姿势

1. transient关键字

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

@Data
@AllArgsConstructor
@NoArgsConstructor
public 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
@NoArgsConstructor
public static class GItem {
    @Expose
    private String user;
    // @IgnoreField
    private String pwd;
}

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

@Test
public 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 {
}


@Test
public 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序列化指定忽略字段内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • MyBatis学习教程之开发Dao的方法教程

    MyBatis学习教程之开发Dao的方法教程

    这篇文章主要给大家介绍了关于MyBatis开发Dao的相关资料,使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法。文中通过示例代码介绍的非常详细,需要的朋友们下面来一起看看吧。
    2017-07-07
  • 使用MyBatis查询千万级数据量操作实现

    使用MyBatis查询千万级数据量操作实现

    这篇文章主要为大家介绍了如何使用MyBatis 查询千万数据量的操作过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • RabbitMQ集群运维实践教程

    RabbitMQ集群运维实践教程

    RabbitMQ的集群模式主要有两种普通集群模式和镜像队列模式,下面给大家分享RabbitMQ集群运维实践教程,感兴趣的朋友跟随小编一起看看吧
    2024-03-03
  • Spring中自动注入的两种方式总结

    Spring中自动注入的两种方式总结

    Spring的核心技术IOC(Intorol of Converse控制反转)的实现途径是DI(dependency Insert依赖注入)。而依赖注入(DI)的实现方式又有两种,xml方式和注解方式。本文就来详细聊聊这两个方式,需要的可以了解一下
    2022-10-10
  • 常见的排序算法,一篇就够了

    常见的排序算法,一篇就够了

    这篇文章主要介绍了一些常用排序算法整理,插入排序算法、直接插入排序、希尔排序、选择排序、冒泡排序等排序,需要的朋友可以参考下
    2021-07-07
  • Java向数据库中插入数据后获取自增ID的常用方法

    Java向数据库中插入数据后获取自增ID的常用方法

    有时候因为新增的需求需要获取刚刚新增的数据的自增的主键ID,下面这篇文章主要给大家介绍了关于Java向数据库中插入数据后获取自增ID的常用方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • k8s+springboot+CronJob定时任务部署实现

    k8s+springboot+CronJob定时任务部署实现

    本文主要介绍了k8s+springboot+CronJob定时任务部署实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Spring中SpEL表达式的使用全解

    Spring中SpEL表达式的使用全解

    SpEL是Spring框架中用于表达式语言的一种方式,本文主要介绍了Spring中SpEL表达式的使用全解,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-04-04
  • 解决执行maven命令时提示Process terminated的问题

    解决执行maven命令时提示Process terminated的问题

    这篇文章主要介绍了解决执行maven命令时提示Process terminated的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • SpringBoot JWT令牌的使用

    SpringBoot JWT令牌的使用

    JWT令牌中包含了一个用户名和哈希值,这些都需要进行验证,本文主要介绍了SpringBoot JWT令牌的使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03

最新评论