【问题标题】:How to ignore a specific node when parsing XML with Jackson使用 Jackson 解析 XML 时如何忽略特定节点
【发布时间】:2019-01-16 04:25:51
【问题描述】:

我想知道在使用 Jackson ML 模块解析 XML 时是否可以忽略一个或多个节点。

我希望能够解析这个 XML

<bundle>
  <id value="myBundleId"/>
  <meta>
    <profile value="http://myurl/profile1" />
    <profile value="http://myurl/profile2" />
    <tag>
      <system value="https://myurl/system" />
      <code value="myAppCode"/>
    </tag>
  </meta>
  <type value="message" />
</bundle>

进入这个 POJO 对象

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;

import lombok.Data;

@Data
public class Bundle {

    @JacksonXmlElementWrapper(localName = "id")
    @JacksonXmlProperty(isAttribute = true, localName = "value")
    private String id;

    @JacksonXmlElementWrapper(localName = "type")
    @JacksonXmlProperty(isAttribute = true, localName = "value")
    private String type;
}

现在它不起作用,因为我认为注释 @JacksonXmlElementWrapper 仅适用于列表。

它还给了我以下错误消息:

java.lang.IllegalArgumentException:冲突的 setter 定义 属性“值”

【问题讨论】:

  • 尝试将您的字段转换为属性并将其公开。
  • 嗯,你到底是什么意思?我必须补充一点,不幸的是 XML 无法修改,因为它是由外部方提供的。

标签: java xml jackson jackson-dataformat-xml


【解决方案1】:

如果您不介意使用不同的库,SimpleXml 默认会这样做:

public class Bundle {
    @XmlWrapperTag("id")
    @XmlName("value")
    @XmlAttribute
    private String id;

    @XmlWrapperTag("type")
    @XmlName("value")
    @XmlAttribute
    private String type;
}

然后序列化打印:

final SimpleXml simple = new SimpleXml();
final Bundle bundle = simple.fromXml(xml, Bundle.class);
System.out.println(bundle.id + " : " + bundle.type);

这将打印:

myBundleId : message

SimpleXml 在 Maven 中心

<dependency>
    <groupId>com.github.codemonstur</groupId>
    <artifactId>simplexml</artifactId>
    <version>1.5.5</version>
</dependency>

【讨论】:

    【解决方案2】:

    要绑定属性,您可以使用 @JsonProperty Jackson Annotations

    【讨论】:

      【解决方案3】:

      尝试以下方法:

      @JsonIgnoreProperties(ignoreUnknown = true)
      public class Bundle {
         ...
      }
      

      或者:

      mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
      

      【讨论】:

      • 感谢您的建议帮助,因为它允许像我想要的那样忽略 标记。您是否还知道如何将我的 Java 对象属性 id 绑定到 XML 值 myBundleId 而无需创建名为 Id 的子类?
      • @Fred 你可以试试@JsonProperty。但这超出了您原始问题的范围。请提出一个新问题并添加所有相关详细信息。
      • @Fred 如果我的回答解决了您当前的问题,请不要忘记更新接受它:)
      【解决方案4】:

      如果我没记错的话,你可以在对象映射器上设置它,这样可以避免在不匹配的节点上抛出异常。

      objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-27
        • 1970-01-01
        • 2014-03-30
        • 2011-01-09
        • 2023-03-22
        • 1970-01-01
        • 2015-09-10
        • 2019-04-03
        相关资源
        最近更新 更多