6

所以我使用 Jackson 成功地进行JSON 序列化/反序列化直到现在,现在我也尝试使用它来使用它的XML序列化/反序列化jackson-dataformat-xml-2.3.0.jar

我用过

objectmapper.reader(Student.class).withRootName("prefix:student").readValue(jsonString)

将我的 JSON(具有带前缀的根名称)反序列化为Student成功工作的类。

现在,我正在尝试将我的 XML 字符串(具有带前缀的根名称)反序列化为Student

XML:

<prefix:student>
  <name>
    Jack Jones
  </name>
  <id>1</id>
</prefix:student>

我的 POJO:

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
        "name",
        "id",
        ....
    })
    @XmlRootElement(name = "student")
    public class Student
    {

        protected String name;
        BigInteger id;  
..........................
    }

我是这样反序列化XmlMapperjackson-dataformat-xml

xmlMapper.reader(Student.class).withRootName("prefix:student").readValue(xmlString)

我得到以下异常:

java.io.IOException: com.ctc.wstx.exc.WstxParsingException: Undeclared namespace prefix "prefix"
 at [row,col {unknown-source}]: [1,9]
    at com.fasterxml.jackson.dataformat.xml.util.StaxUtil.throwXmlAsIOException(StaxUtil.java:24)
    at com.fasterxml.jackson.dataformat.xml.XmlFactory._createParser(XmlFactory.java:473)
    at com.fasterxml.jackson.dataformat.xml.XmlFactory._createParser(XmlFactory.java:26)
    at com.fasterxml.jackson.core.JsonFactory.createParser(JsonFactory.java:844)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2091)

Caused by: com.ctc.wstx.exc.WstxParsingException: Undeclared namespace prefix "prefix"
 at [row,col {unknown-source}]: [1,9]
    at com.ctc.wstx.sr.StreamScanner.constructWfcException(StreamScanner.java:606)
    at com.ctc.wstx.sr.StreamScanner.throwParseError(StreamScanner.java:479)
    at com.ctc.wstx.sr.InputElementStack.resolveAndValidateElement(InputElementStack.java:507)
    at com.ctc.wstx.sr.BasicStreamReader.handleStartElem(BasicStreamReader.java:2977)
    at com.ctc.wstx.sr.BasicStreamReader.handleRootElem(BasicStreamReader.java:2098)
    at com.ctc.wstx.sr.BasicStreamReader.nextFromProlog(BasicStreamReader.java:2078)
    at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1134)
    at com.fasterxml.jackson.dataformat.xml.XmlFactory._initializeXmlReader(XmlFactory.java:581)
    at com.fasterxml.jackson.dataformat.xml.XmlFactory._createParser(XmlFactory.java:471)
    ... 6 more

使用自定义根名称进行 XML 反序列化需要做什么?

4

2 回答 2

4

尝试将您的 XmlMapper 配置为忽略命名空间:

XMLInputFactory input = new WstxInputFactory();
input.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, Boolean.FALSE);
XmlMapper xmlMapper = new XmlMapper(new XmlFactory(input, new WstxOutputFactory()));

此外,您可能需要将您的更改 @XmlRootElement(name= "student")@XmlRootElement(name= "prefix:student")

编辑 :

正如 StaxMan 所说,您的问题来自您使用尚未声明的前缀这一事实。

这可以从您给我们的日志中推断出来(第 1 行和第 9 行 => 未声明的命名空间前缀“前缀”)。

我的印象是您无法修改您的 XML 字符串。

但如果可以的话,StaxMan 解决方案会更干净,您应该添加命名空间声明,而不是禁用解析器命名空间验证:

<prefix:student xmlns:prefix="http://www.somenamespace.org">
  <name>
    Jack Jones
  </name>
  <id>1</id>
</prefix:student>
于 2016-09-06T07:47:19.313 回答
1

您的问题是 XML 输入无效,因为它缺少命名空间声明prefix:如果启用了命名空间处理(正如大多数现代 XML 解析器所启用的那样),Jackson XML 模块对此无能为力。

但根据其他答案,通常可以配置底层 XML 解析器以禁用命名空间处理,在这种情况下,整个元素名称仅被视为“本地名称”的一部分,并且不会维护命名空间信息。

只要确保使用其中一个WoodstoxAaltoStax 解析器:我认为 JDK 中的一个不支持无命名空间模式。

于 2016-09-06T21:36:46.910 回答