Обновление: лишний код удален
Мне нужно десериализовать объект JSON, который может быть одним из многих подтипов родительского класса.Какой это конкретный подтип, определяется конкретным полем enum в объекте.Я добавил аннотации @JsonTypeInfo
и @JsonSubTypes
в родительский класс и, насколько я могу судить, все они верны.
Однако значение enum не совсем совпадает с именем enumв классе Java.Итак, в классе enum я аннотировал статический метод с помощью @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
}