При попытке десериализации XML
<Schedule>
<Dates>
<Calendar>USD</Calendar>
<Convention>ModifiedFollowing</Convention>
<Tenor>1M</Tenor>
<Dates>
<Date>2012-01-06</Date>
<Date>2012-04-10</Date>
<Date>2012-07-06</Date>
<Date>2012-10-08</Date>
<Date>2013-01-07</Date>
<Date>2013-04-08</Date>
</Dates>
</Dates>
</Schedule>
в
@Data
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@JsonIgnoreProperties(ignoreUnknown = true)
public class ScheduleDto {
@JsonProperty(value = "Dates")
@JacksonXmlElementWrapper(useWrapping = false)
private List<DatesDto> dates = new ArrayList<>();
}
@Data
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@JsonIgnoreProperties(ignoreUnknown = true)
@JacksonXmlRootElement(localName = "Dates")
public class DatesDto {
@JsonProperty(value = "Calendar")
private String calendar;
@JsonProperty(value = "Convention")
private String convention;
@JsonProperty(value = "Tenor")
private String tenor;
@JsonProperty(value = "Date")
@JacksonXmlElementWrapper(localName = "Dates")
private List<String> dates = new ArrayList<>();
}
выдает ошибку:
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.String` out of START_OBJECT token
at [Source: (StringReader); line: 1, column: 108] (through reference chain: sh.zandr.sandbox.how2jackson.domain.ScheduleDto["Dates"]->java.util.ArrayList[0]->sh.zandr.sandbox.how2jackson.domain.DatesDto["Dates"]->java.util.ArrayList[0])
Но если я изменю xml на
<Schedule>
<DatesObj>
<Calendar>USD</Calendar>
<Convention>ModifiedFollowing</Convention>
<Tenor>1M</Tenor>
<Dates>
<Date>2012-01-06</Date>
<Date>2012-04-10</Date>
<Date>2012-07-06</Date>
<Date>2012-10-08</Date>
<Date>2013-01-07</Date>
<Date>2013-04-08</Date>
</Dates>
</DatesObj>
</Schedule>
и ScheduleDto на
@Data
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@JsonIgnoreProperties(ignoreUnknown = true)
public class ScheduleDto {
@JsonProperty(value = "DatesObj")
@JacksonXmlElementWrapper(useWrapping = false)
private List<DatesDto> dates = new ArrayList<>();
}
он работает правильно.
Это ошибка Джексона? Потому что я ожидаю, что он будет обработан рекурсивно, поэтому во время десериализации внутреннего <Dates>
он ничего не будет знать о внешнем <Dates>
. Или его можно как-то настроить для правильной десериализации оригинального XML (потому что я не могу изменить ввод)?