前言

今天旁边同事问了我一个问题:他给外部系统提供了一个API接口,对方希望他的接口返回值做一下处理,只返回非空的数据,把空字段过滤一下,问我要怎么处理。

例如:

{
    "code":200
    "data":{
       "code":"123",
       "name":"苏三",
       "address":null,
    }
}

这种情况的接口返回值,不返回address字段。

其实,这是一个非常常见的需求,我之前处理过,把一些处理办法记录到这篇文章,给大家一个参考。

如果在业务代码中,一个字段一个去校验数据,这种做法太麻烦了。

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

这就需要使用json转换工具,有些是框架底层自带的json转换功能,有些是我们自己编码实现的。

我们只需要在json转换工具中,处理过滤一下空字段即可。

但不同的json序列化框架,过滤空字段的方式有点不一样,今天重点给大家总结了下面这两种最常用的json序列化框架的处理方式。

1 Jackson

在Spring中默认的 json序列化框架是:jackson,它在工作中也是最常用的json处理框架了。

1.1 @JsonInclude注解

在jackson框架中,给我们提供了@JsonInclude注解,它既可以使用在类上面,也没有使用在字段上面。

该注解的value值使用Include.NON_NULL,标记为非空。

例如:

@JsonInclude(JsonInclude.Include.NON_NULL)
@Data
public class Test{
}

这样整个Test类的所有字段,使用jackson转换成json数据时,只会保留非空的字段,过滤空字段。

此外,@JsonInclude注解还可以使用在具体字段上。

例如:

@Data
public class Test2{

     private String name;

     @JsonInclude(JsonInclude.Include.NON_NULL)
     private String address;
}

这样address字段,jackson转换成json数据时,如果发现是空值,则会直接过滤掉。

1.2 全局配置

如果你想所有的API的返回值的逻辑都一样,统一过滤空字段,可以在ObjectMapper对象中统一设置参数。

例如:

private ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

然后使用mapper对象转换数据时,就可以自动过滤空字段了,例如:

User user = new User();
String json= mapper.writeValueString(user);

2 fastjson

虽说fastjson有一些bug,但有些老项目中,还在大量使用。

其实在也支持在对象转换成json数据时,自动过滤空值。

这个功能可以通过SerializerFeature这个枚举实现。

例如:

User user = new User();
String json = JSONObject.toJSONString(user,SerializerFeature.WriteMapNullValue);

在调用JSONObject.toJSONString方法时,设置一个SerializerFeature.WriteMapNullValue参数即可。

当然SerializerFeature这个枚举的值有很多,大家可以根据实际业务场景使用。

最后修改:2026 年 06 月 06 日
如果觉得我的文章对你有用,请随意赞赏