使用 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。
我有以下 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。