Java Jackson将子类型集枚举字段反序列化为null
更新:删除多余代码 我需要反序列化一个JSON对象,它可以是父类的许多子类型之一。它是哪个特定子类型由对象中的特定枚举字段确定。我已经向父类添加了Java Jackson将子类型集枚举字段反序列化为null,java,enums,jackson,json-deserialization,Java,Enums,Jackson,Json Deserialization,更新:删除多余代码 我需要反序列化一个JSON对象,它可以是父类的许多子类型之一。它是哪个特定子类型由对象中的特定枚举字段确定。我已经向父类添加了@JsonTypeInfo和@JsonSubTypes注释,据我所知,它们都是正确的 但是,枚举值与Java类中的枚举名称不完全相同。因此,在enum类中,我用@JsonCreator注释了一个静态方法,这样Jackson知道如何将值反序列化到一个正确的Java enum 我遇到的问题是,一旦我反序列化了JSON字符串,保存枚举的字段就不包含实际的枚举
@JsonTypeInfo
和@JsonSubTypes
注释,据我所知,它们都是正确的
但是,枚举值与Java类中的枚举名称不完全相同。因此,在enum类中,我用@JsonCreator
注释了一个静态方法,这样Jackson知道如何将值反序列化到一个正确的Java enum
我遇到的问题是,一旦我反序列化了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 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"]
}
}
反序列化对象(从上面的字符串反序列化)
通过同事找到答案 我需要将
@JsonTypeInfo
注释的visible
属性设置为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 {
...
这是很多代码。请回答您的问题并删除所有不需要重新解决问题的内容。Calendar类的第一个中有两个同名的“day”属性,@JsonTypeInfo中有一个同名的属性。
@JsonTypeInfo
中的day
属性不是指Calendar
类中的day
字段吗?或者你是说我复制了那个字段?星期一和星期一有什么区别?一个类有两个不同的类型标识符有意义吗?
Tuesday {
object=Meetings {
meetings=[team, company, client]
},
calendarName=My Tuesdays,
day=null //I want this to be "tuesday", not null
}
@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 {
...