【问题标题】:Jackson XML parser fails when tagsJackson XML 解析器在标记时失败
【发布时间】:2021-05-17 09:54:54
【问题描述】:

当出现如下属性时,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;
}

【问题讨论】:

    标签: java jackson jackson-dataformat-xml


    【解决方案1】:

    如果没有 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);
    

    您还必须使用JacksonXmlRootElement 注释和JacksonXmlText 注释修改您的Example 类,如下所示:

    @JsonIgnoreProperties(ignoreUnknown = true)
    @JacksonXmlRootElement(localName = "some-float-value")
    public class Example {
        
        @JacksonXmlText
        private Float someValue;
    }   
    

    【讨论】:

    • 这是杰克逊版本 2.11.3 的错误。 2.12.3版本解决了
    • @Dasma,谢谢你提供的信息,我不知道。
    【解决方案2】:

    通过从 Jackson 版本 2.11.3 升级到 2.12.3 来解决

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-28
      • 1970-01-01
      • 1970-01-01
      • 2019-08-17
      • 2011-03-19
      • 1970-01-01
      • 2021-01-25
      相关资源
      最近更新 更多