Преобразование 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;