Десериализация XML со списком с использованием Джексона

У меня есть следующий XML-код, который я хотел бы десериализовать в Java POJO.

<testdata>
    <foo>
        <bar>
            <![CDATA[MESSAGE1]]>
        </bar>
        <bar>
            <![CDATA[MESSAGE2]]>
        </bar>
        <bar>
            <![CDATA[MESSAGE3]]>
        </bar>
    </foo>
</testdata>

У меня есть следующие классы Java

public class TestData {

    @JacksonXmlProperty(localName = "foo")
    private Foo foo;

    public Foo getFoo() {
        return foo;
    }

    public void setFoo(Foo foo) {
        this.foo = foo;
    }

}

У меня есть еще один класс, как показано ниже

public class Foo {

    @JacksonXmlProperty(localName = "bar")
    @JacksonXmlCData
    private List<String> barList;

    public List<String> getBarList() {
        return barList;
    }

    public void setBarList(List<String> barList) {
        this.barList = barList;
    }
}

Теперь, когда я запускаю код, используя класс ниже, я получаю исключение

private void readXml() throws FileNotFoundException, IOException {
    File file = new File("/Users/temp.xml");
    XmlMapper xmlMapper = new XmlMapper();
    String xml = GeneralUtils.inputStreamToString(new FileInputStream(file));
    TestData testData = xmlMapper.readValue(xml, TestData.class);
    System.out.println(testData.getFoo()
                               .getBarList());
}

Исключение в потоке "main" com.fasterxml.jackson.databind.exc.MismatchedInputException: невозможно десериализовать экземпляр java.util.ArrayList из токена VALUE_STRING

Как преобразовать bar элементов в List? Я пробовал несколько вещей, но продолжаю получать те или иные ошибки


person Damien-Amen    schedule 07.03.2018    source источник


Ответы (1)


Вам необходимо указать, что <bar> является элементом оболочки для вашей коллекции String сообщений:

Это должно работать в вашем Foo классе:

@JacksonXmlProperty(localName = "bar")
@JacksonXmlCData
@JacksonXmlElementWrapper(useWrapping = false)
private List<String> barList;
person hovanessyan    schedule 07.03.2018
comment
Что, если бы у бара был атрибут, например ‹имя бара = что угодно›, и я хотел бы это зафиксировать? - person Steve; 07.09.2018
comment
С помощью Jackson вы можете посмотреть @ .JacksonXmlProperty с isAttribute = true в качестве свойства аннотации. - person hovanessyan; 07.09.2018
comment
это спасло мне жизнь! - person Eduardo Dennis; 22.09.2018
comment
У меня такая же проблема, но для меня проблема в том, что это возвращает только первый элемент панели, а других нет. - person Majid Ali Khan; 26.11.2019
comment
@hovanessyan должен ли я добавить @ .JacksonXmlProperty с isAttribute = true это в Bar pojo, где поле имени? или в Foo Pojo, в поле Bar? как показано ниже: @JacksonXmlProperty (localName = bar, isAttribute = true) - person Azhagu Surya; 22.02.2021