Jackson ObjectMapper 有一个功能可以删除空值:
class Car {
Optional<String> ownerName;
String manufacturer;
public Optional<String> getOwnerName() { return ownerName; }
public String getManufacturer() { return manufacturer; }
}
Car batMobile = new Car();
batMobile.owner = Optional.of("Batman");
batMobile.manufacturer = null;
Car stolenCar = new Car();
stolenCar.owner = Optional.empty();
stolenCar.manufacturer = "Tesla";
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(Include.NON_ABSENT);
mapper.writeValueAsString(batMobile);
/*
{
"ownerName": "Batman"
}
*/
mapper.writeValueAsString(stolenCar);
/*
{
"manufacturer": "Tesla"
}
*/
Run Code Online (Sandbox Code Playgroud)
我想要的是删除Optional.empty值,但保留空值:
mapper.writeValueAsString(batMobile);
/*
{
"ownerName": "Batman",
"manufacturer": null
}
*/
mapper.writeValueAsString(stolenCar);
/*
{
"manufacturer": "Tesla"
}
*/
Run Code Online (Sandbox Code Playgroud)
我希望这能够在全球范围内应用,而不需要在 DTO 上进行任何注释。
如果您使用,java.util.Optional请确保您已注册com.fasterxml.jackson.datatype.jdk8.Jdk8Module提供额外序列化器和反序列化器的模块。
在您的情况下,最简单的方法是在属性级别使用注释:
class Car {
@JsonInclude(JsonInclude.Include.NON_EMPTY)
Optional<String> ownerName;
@JsonInclude
String manufacturer;
//getters, setters
}
Run Code Online (Sandbox Code Playgroud)
默认值是Include.ALWAYS您的情况应该使用的值。
如果您想在全局范围内执行此操作,则需要实现自定义过滤器并手动检查所有情况。简单的例子:
class CustomFilter {
@Override
public boolean equals(Object obj) {
// return false to keep value in response
// return true to filter out value from response
if (obj == null) {
return false;
}
if (obj instanceof Optional) {
Optional opt = (Optional) obj;
return !opt.isPresent();
}
//other cases if needed
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
您可以按如下方式注册:
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.registerModule(new Jdk8Module());
mapper.setDefaultPropertyInclusion(JsonInclude.Value.construct(JsonInclude.Include.CUSTOM, JsonInclude.Include.CUSTOM, CustomFilter.class, CustomFilter.class));
Run Code Online (Sandbox Code Playgroud)
如果这不是您想要的,您需要设置全局最合适的值,并为给定的属性设置另一个值。如果您无法修改DTO类,则始终可以使用MixIn功能。