前言
今天旁边同事问了我一个问题:他给外部系统提供了一个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这个枚举的值有很多,大家可以根据实际业务场景使用。