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

相关文章

  • SpringCloud读取Nacos配置中心报错及遇到的坑:Could not resolve placeholder ‘xxx’ in value ‘${xxx}

    SpringCloud读取Nacos配置中心报错及遇到的坑:Could not resolve placehold

    这篇文章主要介绍了SpringCloud读取Nacos配置中心报错:Could not resolve placeholder ‘xxx’ in value ‘${xxx},本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • java Swing实现选项卡功能(JTabbedPane)实例代码

    java Swing实现选项卡功能(JTabbedPane)实例代码

    这篇文章主要介绍了java Swing实现选项卡功能(JTabbedPane)实例代码的相关资料,学习java 基础的朋友可以参考下这个简单示例,需要的朋友可以参考下
    2016-11-11
  • spring基础系列之JavaConfig配置详解

    spring基础系列之JavaConfig配置详解

    本篇文章主要介绍了spring基础系列之JavaConfig配置详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • Spring Cloud Zuul自定义过滤器的实现

    Spring Cloud Zuul自定义过滤器的实现

    这篇文章主要介绍了自定义Spring Cloud Zuul过滤器的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • java开发RocketMQ生产者高可用示例详解

    java开发RocketMQ生产者高可用示例详解

    这篇文章主要为大家介绍了java开发RocketMQ生产者高可用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 在springboot中对kafka进行读写的示例代码

    在springboot中对kafka进行读写的示例代码

    本篇文章主要介绍了在springboot中对kafka进行读写的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Java面向对象类和对象实例详解

    Java面向对象类和对象实例详解

    面向对象乃是Java语言的核心,是程序设计的思想,这篇文章主要介绍了Java面向对象类和对象的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • springboot整合freemarker代码自动生成器

    springboot整合freemarker代码自动生成器

    最近做了一个工具,可以实现代码自动生成,今天整理出来分享给大家,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • 详解Spring中的@PropertySource注解使用

    详解Spring中的@PropertySource注解使用

    这篇文章主要介绍了Spring的@PropertySource注解使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • Java中list根据id获取对象的几种方式

    Java中list根据id获取对象的几种方式

    这篇文章主要给大家介绍了关于Java中list根据id获取对象的几种方式,文中通过实例代码介绍的非常详细,对大家学习或者使用java具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07

最新评论