Как десериализовать XML с аннотациями с использованием FasterXML
У меня есть следующая схема XML:
<Courses semester="1">
<Course code="A231" credits="3">Intermediate A</Course>
<Course code="A105" credits="2">Intro to A</Course>
<Course code="B358" credits="4">Advanced B</Course>
</Courses>
Мне нужно конвертировать это в POJO как:
public class Schedule
{
public int semester;
public Course[] courses;
}
public class Course
{
public String code;
public int credits;
public String name;
}
Здесь следует отметить две важные вещи:
- Объект курсов не обернут в тег
- Некоторые из свойств являются атрибутами
Как мне нужно аннотировать мои объекты, чтобы заставить FasterXML десериализовать этот xml?
1 ответ
Вы должны добавить jackson-dataformat-xml
зависимость от вашего проекта:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.3.3</version>
</dependency>
После этого вы можете использовать аннотации XML следующим образом:
@JacksonXmlRootElement(localName = "Courses")
class Schedule {
@JacksonXmlProperty(isAttribute = true)
private int semester;
@JacksonXmlProperty(localName = "Course")
private Course[] courses;
// getters, setters, toString, etc
}
class Course {
@JacksonXmlProperty(isAttribute = true)
private String code;
@JacksonXmlProperty(isAttribute = true)
private int credits;
@JacksonXmlText(value = true)
private String name;
// getters, setters, toString, etc
}
Теперь вы должны использовать XmlMapper
вместо ObjectMapper
:
JacksonXmlModule module = new JacksonXmlModule();
module.setDefaultUseWrapper(false);
XmlMapper xmlMapper = new XmlMapper(module);
System.out.println(xmlMapper.readValue(xml, Schedule.class));
Над сценарием печатает:
Schedule [semester=1, courses=[[code=A231, credits=3, name=Intermediate A], [code=A105, credits=2, name=Intro to A], [code=B358, credits=4, name=Advanced B]]]