使用 Jackson 反序列化 XML 列表

Deserializing XML with list using Jackson

我有以下 XML 想要反序列化为 Java POJO。

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

我有以下 Java classes

public class TestData {

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

    public Foo getFoo() {
        return foo;
    }

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

}

我还有一个 class 如下所示

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;
    }
}

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

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 中的异常:无法从 VALUE_STRING 令牌

中反序列化 java.util.ArrayList 的实例

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

您需要指明 <bar> 是您收集的 String 条消息的包装元素:

这应该适用于您的 Foo class:

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

如果您的输入 xml 具有类似

属性的条形元素列表
<testdata>
    <foo>
        <bar name="John">
            <![CDATA[MESSAGE1]]>
        </bar>
        <bar name="Mary">
            <![CDATA[MESSAGE2]]>
        </bar>
        <bar name="Bill">
            <![CDATA[MESSAGE3]]>
        </bar>
    </foo>
<testdata>

您可以创建一个 Bar class 并将其列表作为 Foo class:

的一个字段
    @JacksonXmlProperty(localName = "bar")
    @JacksonXmlElementWrapper(useWrapping = false)
    private List<Bar> barList;

Bar class 将是:

    class Bar {    
        @JacksonXmlProperty(isAttribute = true)
        private String name; 

        @JacksonXmlCData
        private String content;
   }

请记住为 Bar class 添加 getter 和 setter。