接口返回值如何去掉空字段?

在开发过程中,对外接口有如下需求:系统提供了一个API接口,对方希望他的接口返回值做一下处理,只返回非空的数据,把空字段过滤一下,我们需要如何做?

图片[1]-接口返回值如何去掉空字段?-不念博客

比如:

{
    "success": true,
    "code": 10000,
    "message": "操作成功!",
    "data": {
        "id": null,
        "title": "springboot葵花宝典",
        "description": "微信公众号",
        "published": null
    }
}

上面JSON数据published值为null,那么在返回前端的时候我们需要不返回published字段。

这是一种比较常见的需求,我把我常用的处理办法进行总结,供大家参考。

提供的API接口,在返回json数据给用户之前,需要将实体对象转换成json数据。

这就需要使用json转换工具,在Spring框架中默认的JSON序列化框架是Jackson,这是最常用的Json处理框架,当然除此之外可能小伙伴们也可能会使用fastjson,我们都会进行介绍

1. Jackson去空值

1.1. 局部配置去空值

Jackson 框架中,给我们提供@JsonInclude注解,既可以使用在类上面,也可以使用在字段上面,该注解的value值使用Include.NON_NULL,标记为非空。

  • @JsonInclude注解使用在具体字段
@Data
public class Tutorial implements Serializable {


    private Long id;

    private String title;

    private String description;
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private Integer published;

    private static final long serialVersionUID = 1L;
}

Jackson转换成json数据的时候,如果发现published为空值,就会直接过滤

  • @JsonInclude注解使用在具体类
@JsonInclude(JsonInclude.Include.NON_NULL)
@Data
public class Tutorial implements Serializable {
  // 省略...
}

Jackson转换成json数据的时候,如果发现Tutorial类中只要有字段存在空值,就会直接过滤字段

思考:可能有很多接口有这样的需求,难道我们需要一个个在类上添加该注解?

肯定不是的,我们可以进行Jackson全局配置,统一过滤空字段

1.2. 全局配置去空值

Jackson在Spring Boot中的配置通常较为简单,因为Spring Boot默认使用MappingJackson2HttpMessageConverter作为JSON消息转换器,而不需要特定的配置类。

只需要配置ObjectMapper,可以轻松地实现实现在接口返回值中去掉空字段

/**
 * @Author: springboot
 * @Github: https://github.com/bangbangzhou
 * @description: TODO
 */
@Configuration
public class JacksonConfig {

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        // 设置在序列化时不包括值为null的字段
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        // 其他定制配置,根据需要添加

        return objectMapper;
    }
}

这个配置类使用ObjectMapper来配置Jackson的一些特性,其中setSerializationInclusion(JsonInclude.Include.NON_NULL)将在序列化时排除掉值为null的字段。

注意:SpringBoot使用HttpMessageConverter接口转换HTTP请求和响应。开箱即用中包含明智的默认设置。

例如,可以将对象自动转换为JSON(通过使用Jackson库)默认情况下,字符串以UTF-8编码。

2.Fastjson去空值

fastjson是阿里开源的高性能JSON序列化框架,虽然fastjson有一些bug,但有些项目还在大量使用。

如果使用的是Fastjson作为JSON序列化库,需要通过配置FastJsonHttpMessageConverter和FastJsonConfig来实现在接口返回值中去掉空字段

@Configuration
public class MyFastjsonConfig {
    @Bean
    public HttpMessageConverters fastJsonHttpMessageConverters(){
        //1、先定义一个convert转换消息的对象
        FastJsonHttpMessageConverter fastConverter=new FastJsonHttpMessageConverter();
        //2、添加fastjson的配置信息,比如是否要格式化返回的json数据;
        FastJsonConfig fastJsonConfig=new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
        //3、在convert中添加配置信息
        fastConverter.setFastJsonConfig(fastJsonConfig);
        HttpMessageConverter<?> converter=fastConverter;
        return new HttpMessageConverters(converter);
    }

}
© 版权声明
THE END