java - Jackson 反序列化子类型将枚举字段设置为 null
问题描述
更新:删除了多余的代码
我需要反序列化一个 JSON 对象,它可以是父类的许多子类型之一。它是哪个特定的子类型由对象中的特定枚举字段确定。我已经在父类中添加了@JsonTypeInfo
注释@JsonSubTypes
,据我所知它们都是正确的。
但是,枚举值与 Java 类中的枚举名称并不完全相同。因此,在枚举类中,我使用了一个静态方法注释,@JsonCreator
因此杰克逊知道如何将值反序列化为适当的 Java 枚举。
我遇到的问题是,一旦我反序列化 JSON 字符串,保存枚举的字段不包含实际的枚举值 - 它保留为null
.
为什么该day
字段保留为null
以及如何在反序列化期间按预期设置它?
代码如下。
家长日历类
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "day")
// For the sake of correct deserialisation, we need to map from values of type to child model classes explicitly
@JsonSubTypes({ @JsonSubTypes.Type(value = Monday.class, name = "monday"),
@JsonSubTypes.Type(value = Monday.class, name = "mon"),
@JsonSubTypes.Type(value = Tuesday.class, name = "tuesday"),
@JsonSubTypes.Type(value = Tuesday.class, name = "tues")})
public class Calendar {
protected String calendarName;
protected DaysOfWeek day;
@JsonProperty("calendarName")
public String getCalendarName() {
return calendarName;
}
public void setCalendarName(String calendarName) {
this.calendarName = calendarName;
}
@JsonProperty("day")
public DaysOfWeek getDay() {
return day;
}
public void setDay(DaysOfWeek day) {
this.day = day;
}
}
儿童班周一和周二周一
public class Monday extends Calendar {
private NegativeFeelings object;
public Monday() {
}
public Monday(NegativeFeelings object) {
this.object = object;
}
@JsonProperty("object")
public NegativeFeelings getObject() {
return object;
}
public void setObject(NegativeFeelings object) {
this.object = object;
}
}
周二
public class Tuesday extends Calendar {
private Meetings object;
public Tuesday() {
}
public Tuesday(Meetings object) {
this.object = object;
}
@JsonProperty("object")
public Meetings getObject() {
return object;
}
public void setObject(Meetings object) {
this.object = object;
}
}
DaysOfWeek 枚举类
public enum DaysOfWeek {
MONDAY("monday"),
MON("mon"),
TUESDAY("tuesday"),
TUES("tues");
private String value;
DaysOfWeek(String value) {
this.value = value;
}
@Override
@JsonValue
public String toString() {
return String.valueOf(value);
}
@JsonCreator
public static DaysOfWeek fromEventString(@JsonProperty("value") String eventString) {
return Arrays.stream(DaysOfWeek.values()).filter(e -> e.value.equals(eventString)).findFirst().get();
}
}
JSON 源字符串
{
"calendarName":"My Tuesdays",
"day":"tuesday",
"object":{
"meetings":[
"team",
"company",
"client"]
}
}
反序列化对象(从上面的字符串反序列化)
Tuesday {
object=Meetings {
meetings=[team, company, client]
},
calendarName=My Tuesdays,
day=null //I want this to be "tuesday", not null
}
解决方案
通过同事找到答案。
我需要将注释的visible
属性设置为:@JsonTypeInfo
true
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "day", visible = true)
// For the sake of correct deserialisation, we need to map from values of type to child model classes explicitly
@JsonSubTypes({ @JsonSubTypes.Type(value = Monday.class, name = "monday"),
@JsonSubTypes.Type(value = Monday.class, name = "mon"),
@JsonSubTypes.Type(value = Tuesday.class, name = "tuesday"),
@JsonSubTypes.Type(value = Tuesday.class, name = "tues")})
public class Calendar {
...
推荐阅读
- r - 如何小写变量 dplyr 和 sparklyr?
- macos - 运行 belvu Mojave 时出错:10.14.3 (18D109)
- reactjs - 如何在reactjs的输入字段中放置逗号分隔符?
- smartcard - 什么是 DoD CAC ADPU 登录序列?
- regex - 如何使用 python 正则表达式在两个单词边界后捕获句子的其余部分(给出的示例)
- python - Python Socket连接同一网络上的两个设备
- sql - SQL Server SELECT 返回包含单引号的字符串
- npm - package-lock.json 解析链接指向本地工件 URL,而不是全局设置注册表
- python - 适用于 AWS CodeBuild 的 Brother/Sister 文件夹中的 Python 相对导入
- groovy - Groovy (SoapUI) 选择与部署的 API 兼容的请求并使用它们