Преобразование XML-строки в Java-объект Джексона / JAXB

Первое размещение сообщений на stackru, кроме поиска некоторой помощи!

У меня есть блоб XML, который я пытаюсь десериализовать в простой Java-объект.

У меня есть следующий блоб XML:

<library>
    <book index="654" name="Harry Potter" price="£11.99" rating="5"/>
    <book index="7893" name="Ready Player One" price="£16.99" rating="5"/>
    <book index="433" name="Piers Morgan; Don't You Know Who I Am?" price="£8.99" rating="2"/>
</library>

Затем я пытаюсь преобразовать это в простой POJO:

@JacksonXmlRootElement(localName = "library")
public class Library {
    //This will be the breaking point :'(
    List<Book> bookList = new ArrayList<>();
}

public class Book {
    @JacksonXmlProperty(isAttribute = true)
    Integer index;

    @JacksonXmlProperty(isAttribute = true)
    String name;

    @JacksonXmlProperty(isAttribute = true)
    String price;

    @JacksonXmlProperty(isAttribute = true)
    Integer rating;
}

Я изо всех сил пытаюсь найти правильные аннотации для использования в документации Jacksons. Я уверен, что это должно быть действительно простым изменением, как обычно!

Я выбрал Джексона вместо JAXB, так как Джексон - более новая библиотека, и мне известны некоторые проблемы со скоростью, связанные с JAXB.

Независимо от того, как я стараюсь, я застреваю, список книг возвращается без записей. Кто-нибудь может помочь? Кто-нибудь посоветует мне взглянуть на Джексона через Джексона?

1 ответ

Как вы и ожидали, вам нужно только несколько аннотаций на List<Book> свойство, чтобы заставить десериализацию Джексона корректно работать с вашим содержимым XML:

  • Тебе нужно @JacksonXmlProperty с isAttribute = false (сказать Джексону у вас есть <book> элементы, но не book = "...." атрибуты) и localName = "book" (сказать Джексону название этих элементов)
  • Тебе нужно @JacksonXmlElementWrapper с useWrapping = false (чтобы сказать Джексону, что у вас нет дополнительного элемента оболочки вокруг этих <book> элементы)
  • И, кстати: вам не нужно инициализировать его = new ArrayList<>() потому что десериализация Джексона будет заботиться об этом тоже.
@JacksonXmlProperty(isAttribute = false, localName = "book")
@JacksonXmlElementWrapper(useWrapping = false)
List<Book> bookList;
Другие вопросы по тегам