Как игнорировать определенный узел при разборе XML с помощью Jackson

Я хочу знать, можно ли игнорировать один или несколько узлов при разборе XML с использованием модуля Jackson ML.

Я хочу иметь возможность анализировать этот 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: конфликтующие определения установщика для свойства «значение»


person Fred    schedule 08.08.2018    source источник
comment
Попробуйте превратить свои поля в свойства и сделать их общедоступными.   -  person ylax    schedule 08.08.2018
comment
Хм, что именно ты имеешь в виду? Я должен добавить, что, к сожалению, XML нельзя изменить, так как он предоставлен сторонней стороной.   -  person Fred    schedule 08.08.2018


Ответы (4)


Попробуйте следующее:

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

В качестве альтернативы:

mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
person cassiomolin    schedule 08.08.2018
comment
Спасибо, то, что вы предложили, помогает, поскольку позволяет игнорировать метатег, как я и хотел. Есть ли у вас также какие-либо идеи, как я могу связать свое свойство объекта Java id со значением XML myBundleId без необходимости создавать подкласс с именем Id? - person Fred; 08.08.2018
comment
@Fred Вы можете попробовать @JsonProperty. Но это выходит за рамки вашего первоначального вопроса. Пожалуйста, задайте новый вопрос и добавьте к нему все необходимые детали. - person cassiomolin; 09.08.2018
comment
@Fred Если мой ответ решит вашу текущую проблему, не забудьте обновить и принять его :) - person cassiomolin; 09.08.2018

Если я правильно помню, вы можете установить это в сопоставителе объектов, и это позволит избежать возникновения исключений на несопоставленных узлах.

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

person Rich Ackroyd    schedule 08.08.2018

для привязки свойств вы можете использовать @JsonProperty аннотации Джексона

person jker    schedule 08.08.2018

Если вы не возражаете против использования другой библиотеки, 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>
person jurgen    schedule 11.08.2018