【问题标题】:Simple Jackson XML deserialization to Java not working对 Java 的简单 Jackson XML 反序列化不起作用
【发布时间】:2014-11-11 17:58:09
【问题描述】:

我希望有人能指出我在逃避什么。这是我第一次尝试反序列化 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: 无法识别的字段“产品”(....问题),未标记为可忽略 (0 个已知属性:])在 [来源:J:\stuff.xml;行:1,列: 19](通过引用链:....Problem["products"])

【问题讨论】:

  • 抱歉,我生成的 XML 没有出现在我的原始帖子中。 "hi"
  • 您可以随时编辑您的帖子。使用{} 按钮包装选定的代码或标记。
  • 您使用的是哪个版本的jackson-xml-bind 库?
  • 这对我来说非常适合 2.4.2。
  • 谢谢。我正在使用 jackson-databind-2.3.3.jar 和 Jackson-dataformat-xml-2.3.3.jar。

标签: java xml serialization jackson pojo


【解决方案1】:

这是一个与内部类有关的问题。要创建您的 Myroot 实例,Jackson 需要一个封闭的 Problem 实例。它似乎试图做一些奇怪的反序列化。我现在无法解释。

简单的解决方案是没有内部类。将所有类设为顶级类(或 static 嵌套)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多