java - 简单的 Jackson XML 反序列化到 Java 不起作用

标签 java xml serialization jackson pojo

我希望有人能指出我所忽略的事情。这是我第一次尝试反序列化 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/

相关文章:

java - 以编程方式声明 View 时应用什么单位?

java - If...Else 语句总是转向 "else"。

algorithm - 存储精确集合成员的最有效方式?

ruby-on-rails - Rails 无法启动服务器序列化程序 has_many 错误

java - 使用 Hibernate 3.6.3 时获取 ClassNotFoundException 并且刚刚在 Tomcat 中添加了 DefaultPreUpdateEventListener

java Quartz2 cron触发器没有立即触发

javascript - 限制 XML 文件中回显的 Ajax 回复数量

java - 如何在布局中将图像放在textview下面?

java.io.NotSerializableException 即使我实现了 "Serializable"

java - Web 服务中的 selenium 抛出 java.lang.NoClassDefFoundError 异常