使用Jackson使用列表反序列化XML

Dam*_*men 2 java jackson fasterxml

我有以下XML,我想反序列化为Java POJO.

<testdata>
    <foo>
        <bar>
            <![CDATA[MESSAGE1]]>
        </bar>
        <bar>
            <![CDATA[MESSAGE2]]>
        </bar>
        <bar>
            <![CDATA[MESSAGE3]]>
        </bar>
    </foo>
</testdata>
Run Code Online (Sandbox Code Playgroud)

我有以下Java类

public class TestData {

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

    public Foo getFoo() {
        return foo;
    }

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

}
Run Code Online (Sandbox Code Playgroud)

我有另一个类,如下

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,当我使用下面的类运行代码时,我得到一个异常

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());
}
Run Code Online (Sandbox Code Playgroud)

线程"main"中的异常com.fasterxml.jackson.databind.exc.MismatchedInputException:无法反序列java.util.ArrayList化VALUE_STRING标记之外的实例

如何将bar元素转换为List?我尝试了很多东西,但我不断得到一些或其他错误

hov*_*yan 5

您需要指明这<bar>是您的String邮件集合的包装元素:

这应该适用于你的Foo班级:

@JacksonXmlProperty(localName = "bar")
@JacksonXmlCData
@JacksonXmlElementWrapper(useWrapping = false)
private List<String> barList;
Run Code Online (Sandbox Code Playgroud)

  • 如果“bar”有一个属性,即 &lt;bar name="whatever"&gt;,并且我想捕获它怎么办? (2认同)