用Jackson解析XML时如何忽略特定节点

时间:2018-08-08 19:49:58

标签: java xml jackson jackson-dataformat-xml

我想知道在使用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:与下列设置器的定义冲突   属性“值”

4 个答案:

答案 0 :(得分:1)

尝试以下操作:

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

或者:

mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如果您不介意使用其他库,则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>