如何使用 FasterXML 反序列化带有注释的 XML
Posted
技术标签:
【中文标题】如何使用 FasterXML 反序列化带有注释的 XML【英文标题】:How to deserialize XML with annotations using FasterXML 【发布时间】:2014-07-01 04:42:25 【问题描述】:我有以下 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]]]
【讨论】:
不幸的是,如果我没记错的话,@JacksonXmlText
在最新的杰克逊库中不再可用。你知道该怎么做吗?
@StefanoScarpanti,在 JavaDoc 中,2.11 版本仍然可用。 main project page 还描述了它是如何工作的,所以它应该在那里。你用的是哪个版本?
好吧,你是对的,我强制在我的 pom 2.9.6 jackson 版本中,我可以使用这些注释。谢谢。以上是关于如何使用 FasterXML 反序列化带有注释的 XML的主要内容,如果未能解决你的问题,请参考以下文章
带有杰克逊 JsonProperty 的 Lombok 构建器模式
如何使quickxml ObjectMapper与codehaus注释一起使用
使用 com.fasterxml.jackson.databind.ObjectMapper 在序列化/反序列化 JSON 内容期间从异常日志中删除敏感数据
RabbitMQ反序列化失败 com.fasterxml.jackson.databind.exc.MismatchedInputException