Преобразование XML-строки в Java-объект Джексона / JAXB - PullRequest
0 голосов
/ 06 ноября 2018

Первая публикация в стеке, кроме обращения за помощью!

У меня есть блоб 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 Ответ

0 голосов
/ 07 ноября 2018

Как вы и ожидали, вам нужно всего лишь несколько аннотаций к вашему 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...