десериализация XML-полиморфного списка с помощью jackson

#java #xml #jackson

#java #xml #джексон

Вопрос:

У меня проблема с десериализацией следующего xml:

 <root>
  <apples>
    <apple>
      <id>1</id>
      <weight>0.6</id>
    </apple>
    <apple>
      <id>2</id>
      <weight>0.7</id>
    </apple>
  </apples>
</root>
 

для java:

 public class Root {
  private List<Fruits> fruits;
}
 

В приведенном выше источнике xml другими вариантами могут быть, например, апельсины / апельсины и т. Д. Также, Поскольку это собственный xml, я не могу изменить его схему. По умолчанию я использую @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT) и @JsonSubTypes({/*fruits subtypes listed*/}) . После нескольких неудачных попыток я не уверен, какое правильное отображение / конфигурация для решения проблемы.

Ответ №1:

Из коробки, Jackson это JSON парсер, а не XML .

Существуют расширения Jackson , позволяющие осуществлять XML конвертацию. См. http://wiki.fasterxml.com/JacksonExtensionXmlDataBinding для получения дополнительной информации там. Но кажется, что чистый синтаксический анализатор XML может быть лучше для этого случая.

Возможно javax.xml.stream.* , посылки.

т. е. http://www.javacodegeeks.com/2013/05/parsing-xml-using-dom-sax-and-stax-parser-in-java.html для получения дополнительной информации.

Комментарии:

1. Я знаю о лучших решениях для сопоставления XML. Я рассматриваю возможность использования одного из них. Однако я пишу интеграцию для нескольких служб rest (используя spring RestTemplate) — большинство из них использует json, и теперь это всего лишь второй случай, когда требуется использовать rest — XML (и без schema / DTD). Поэтому, прежде чем я решу использовать другое решение, я бы попытался решить эту проблему, даже используя выделенный десериализатор.

2. ОК. Я подозреваю, что пытаться использовать его будет сложнее Jackson XML , но XmlDataBinding ссылка, которую я добавил выше, может стоить попробовать, если вы хотите продолжить Jackson . Я бы просто добавил, что, поскольку он не поддерживается «из коробки», использование чего-то подобного, по XmlDataBinding сути, также является другим решением.