我希望有人能指出我所忽略的事情。这是我第一次尝试反序列化 XML。这是我的问题的简化。
谢谢
哈罗德
问题在Problem.java中演示
import java.io.File;
import java.io.IOException;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
public class Problem {
public Problem() {
// TODO Auto-generated constructor stub
}
public static void main(String[] args)
{
Problem problem = new Problem();
problem.demonstrate();
}
@JacksonXmlRootElement(localName = "myroot")
public class Myroot {
@JacksonXmlElementWrapper(useWrapping = false)
@JacksonXmlProperty(localName = "products")
@JsonProperty("products")
public Products[] products;
@JsonCreator public Myroot() {}
public Products[] getProducts() {
return products;
}
public void setProducts(Products[] products) {
this.products = products;
}
}
public class Products {
@JsonCreator public Products() {}
@JacksonXmlProperty(localName = "foo")
public String foo = "hi";
public String getFoo() {
return foo;
}
public void setFoo(String foo) {
this.foo = foo;
}
}
public void demonstrate()
{
Products products = new Products();
Products[] productsList = new Products[1];
productsList[0] = products;
try {
Myroot myrootOut= new Myroot();
myrootOut.setProducts(productsList);
XmlMapper xmlMapper = new XmlMapper();
xmlMapper.writeValue(new File("J:\\stuff.xml"), myrootOut);
Myroot migrationCompatibility = xmlMapper.readValue(new File("J:\\stuff.xml"), Myroot.class);
System.out.println(migrationCompatibility);
} catch (IOException e) {
e.printStackTrace();
}
}
}
序列化按预期工作并按预期生成 xml。
<myroot><products><foo>hi</foo></products></myroot>
但是,上面对反序列化的补充调用会导致异常。它似乎无法识别该标签,但我不明白为什么。
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "products" (....Problem), not marked as ignorable (0 known properties: ]) at [Source: J:\stuff.xml; line: 1, column: 19] (through reference chain: ....Problem["products"])
最佳答案
这是一个与内部类相关的问题。要创建 Myroot
实例,Jackson 需要一个封闭的 Problem
实例。它似乎试图进行一些奇怪的反序列化。我现在无法解释。
简单的解决方案是不使用内部类。将所有类设为顶级类(或static
嵌套)。
关于java - 简单的 Jackson XML 反序列化到 Java 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25894957/