【问题标题】:Deserializing XML with list using Jackson使用 Jackson 使用列表反序列化 XML
【发布时间】:2018-08-15 18:08:50
【问题描述】:

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

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

线程“主”com.fasterxml.jackson.databind.exc.MismatchedInputException 中的异常:无法将java.util.ArrayList 的实例反序列化出VALUE_STRING 令牌

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

【问题讨论】:

    标签: java jackson fasterxml


    【解决方案1】:

    您需要指出&lt;bar&gt; 是您的String 消息集合的包装元素:

    这应该适用于您的 Foo 类:

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

    【讨论】:

    • 如果“bar”有一个属性,即 ,我想捕捉它怎么办?
    • 使用 Jackson,您可以查看 @.JacksonXmlProperty 并将 isAttribute=true 作为注释的属性。
    • 这救了我的命!
    • 我有同样的问题,但对我来说,问题是这只返回栏的第一个元素而其他元素不存在。
    • @hovanessyan 我应该在名称字段所在的 Bar pojo 上添加带有 isAttribute=true 的 @.JacksonXmlProperty 吗?还是在 Foo Pojo 的 Bar 场?如下所示:@JacksonXmlProperty(localName = "bar",isAttribute = true)
    【解决方案2】:

    如果您的输入 xml 中有一个带有类似属性的 bar 元素列表

    <testdata>
        <foo>
            <bar name="John">
                <![CDATA[MESSAGE1]]>
            </bar>
            <bar name="Mary">
                <![CDATA[MESSAGE2]]>
            </bar>
            <bar name="Bill">
                <![CDATA[MESSAGE3]]>
            </bar>
        </foo>
    <testdata>
    

    您可以创建一个Bar 类并将其列表作为Foo 类的一个字段:

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

    Bar 类将是:

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

    记得为Bar 类包含getter 和setter。

    【讨论】:

      猜你喜欢
      • 2019-09-28
      • 1970-01-01
      • 2022-01-22
      • 2015-02-26
      • 1970-01-01
      • 1970-01-01
      • 2014-10-22
      • 2015-10-17
      • 2013-12-02
      相关资源
      最近更新 更多