我在 JSON 反序列化并将其映射到枚举时遇到问题。我从类似于这两个示例的外部 API 获取 JSON:
{
"someValue": null
}
{
"someValue": "exists"
}
我想将空值映射到某个默认枚举值。
模型对象
SomeEnum someValue;
和枚举类
public enum SomeEnum {
@JsonProperty("exists") EXISTS,
NONE;
}
对于存在,值模型类包含正确的枚举,但如果我得到
null
从API,它仍然是null
在模型中。我试图创建一些由
@JsonCreator
注释的方法,创建自己的枚举反序列化器,使用 @JsonEnumDefaultValue
但这些解决方案都不适合我。有谁知道,如何将空值反序列化为某个默认枚举?
最佳答案
(老实说,我在这里写了这段代码,没有测试它,也许你需要稍微修改一下)
您可以尝试执行以下操作( Enum
带有构造函数并使用 @JsonCreator
):
public enum SomeEnum {
EXISTS("exists"),
NONE(null);
private String value;
SomeEnum (String value) {
this.value = value;
}
@JsonCreator
public static SomeEnum fromValue(String value) {
for (SomeEnum someEnum : SomeEnum.values()) {
if (StringUtils.equalsIgnoreCase(someEnum.getValue(), value)) {
return someEnum;
}
}
throw new IllegalArgumentException("Unknown value " + value);
}
public String getValue () {
return value;
}
}
如果它不起作用,请保留上述枚举并尝试制作自定义转换器(不含 Jackson),如下所示
如果使用 spring boot 你应该把这个活页夹放在你的 Controller 中
@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));
}
}
关于java - 反序列化空值以使用 Jackson 进行枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61051783/