Java 使用Jackson将空值反序列化为枚举
我对JSON反序列化和将其映射到枚举有问题。我将从外部API获取JSON,这两个示例类似:Java 使用Jackson将空值反序列化为枚举,java,spring-boot,jackson,deserialization,Java,Spring Boot,Jackson,Deserialization,我对JSON反序列化和将其映射到枚举有问题。我将从外部API获取JSON,这两个示例类似: { "someValue": null } 我想将空值映射到一些默认枚举值 模型对象 SomeEnum someValue; 和枚举类 public enum SomeEnum { @JsonProperty("exists") EXISTS, NONE; } 对于exists,值模型类包含正确的枚举,但如果我从API中获取null,它在模型中仍然是null 我试图创建一些由@Js
{
"someValue": null
}
我想将空值映射到一些默认枚举值
模型对象
SomeEnum someValue;
和枚举类
public enum SomeEnum {
@JsonProperty("exists") EXISTS,
NONE;
}
对于exists,值模型类包含正确的枚举,但如果我从API中获取null
,它在模型中仍然是null
我试图创建一些由@JsonCreator
注释的方法,使用@JsonEnumDefaultValue
创建自己的枚举反序列化器,但这些解决方案都不适合我。有人知道吗,我如何将null反序列化到某个默认枚举?(老实说,我在这里编写了这段代码,但没有对其进行测试,也许您需要对其进行一些修改)
您可以尝试使用构造函数执行以下操作(Enum
,并使用@JsonCreator
):
如果不起作用,请保留上面的枚举,并尝试制作一个自定义转换器(不带Jackson),如下所示
如果使用spring boot,则应将此活页夹放入控制器中
@InitBinder
public void initBinder(final WebDataBinder webdataBinder) {
webdataBinder.registerCustomEditor(SomeEnum.class, new SomeEnumConverter());
}
以下是用于指定如何将输入值转换为枚举值的自定义转换器
public class SomeEnumConverter extends PropertyEditorSupport {
@Override
public void setAsText(final String text) {
setValue(SomeEnum.fromValue(text));
}
}
现在,我通过创建自定义枚举反序列化器解决了这个问题
class SomeEnumDeserializer extends StdDeserializer<SomeEnum> {
SomeEnumDeserializer() {
super(SomeEnum.class);
}
@Override
public SomeEnum getNullValue(DeserializationContext ctxt) {
return SomeEnum.NONE;
}
@Override
public SomeEnum deserialize(JsonParser p, DeserializationContext ctxt) {
// implementation here
}
但是我还是更喜欢使用@JsonProperty之类的东西,但是对于null,比如@JsonNullProperty或者类似的东西代码>?这不起作用,默认值被null覆盖。您可以只使用
@JsonValue public String getValue()
@JsonValue进行返回,但问题是关于输入检查文档。对于enum,它是双向的。据我所知,@JsonCreator仅用于现有值,而对于null则被忽略。我把我的答案贴了出来。谢谢你回答我的问题。顺便说一句,我没有尝试那个绑定器解决方案,但我尝试使用org.springframework.core.convert.convert.converter.converter实现自定义转换器,但效果不太好
public class SomeEnumConverter extends PropertyEditorSupport {
@Override
public void setAsText(final String text) {
setValue(SomeEnum.fromValue(text));
}
}
class SomeEnumDeserializer extends StdDeserializer<SomeEnum> {
SomeEnumDeserializer() {
super(SomeEnum.class);
}
@Override
public SomeEnum getNullValue(DeserializationContext ctxt) {
return SomeEnum.NONE;
}
@Override
public SomeEnum deserialize(JsonParser p, DeserializationContext ctxt) {
// implementation here
}
@JsonDeserialize(using = SomeEnumDeserializer.class)
public enum SomeEnum {
// code
}