问题描述
当出现如下属性时,Jackson XML 解析器会失败:
<some-float-value fr:relevance="true">99</some-float-value>
错误日志如下所示:
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.Float` out of START_OBJECT token
<some-float-value>99</some-float-value>
我想解析的类是这样的:
@JsonIgnoreProperties(ignoreUnkNown = true)
public class Example {
@JacksonXmlProperty(localName = "some-float-value")
private Float someValue;
}
解决方法
如果没有 fr
命名空间,@JsonIgnoreProperties(ignoreUnknown = true)
注释足以忽略 relevance
属性,但不幸的是,情况并非如此:如果您想摆脱 xml 文件中的命名空间,您可以指示您的 XmlMapper
忽略它们传递自定义 XmlFactory
作为构造函数参数,如下所示:
XMLInputFactory input = new WstxInputFactory();
input.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE,Boolean.FALSE);
XmlMapper mapper = new XmlMapper(new XmlFactory(input,new WstxOutputFactory()));
Example example = mapper.readValue(xml,Example.class);
您还必须使用 Example
注释和 JacksonXmlRootElement
注释修改您的 JacksonXmlText
类,如下所示:
@JsonIgnoreProperties(ignoreUnknown = true)
@JacksonXmlRootElement(localName = "some-float-value")
public class Example {
@JacksonXmlText
private Float someValue;
}
,
通过从 Jackson 版本 2.11.3 升级到 2.12.3 来解决