«MismatchedInputException: Невозможно десериализовать экземпляр` java .lang.String` из токена START_OBJECT », когда внутренний тег с тем же именем, что и внешний - PullRequest
0 голосов
/ 14 января 2020

При попытке десериализации 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 (потому что я не могу изменить ввод)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...