学习使用Jackson库将Java对象转换为XML或从XML文档转换为Java对象。如果我们想在没有JAXB的情况下将一个Java对象转换为XML,Jackson是一个很好的解决方案。
只是要重申一下,marshalling是将Java对象转换为XML文档的过程。Unmarshalling是将XML文档读入Java对象的过程。
目录
1.设置Jackson
包括Maven repo中最新版本的jackson-dataformat-xml。
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.13.0</version>
</dependency>
导入Jackson后,我们可以开始使用其XmlMapper
类来读写XML。
XmlMapper xmlMapper = new XmlMapper();
//POJO -> XML
String xml = xmlMapper.writeValueAsString(pojo);
//XML -> POJO
Class pojo = xmlMapper.readValue(xml);
2.2.XMLMapper类
XMLMapper
是用Jackson处理XML文档的最重要的类。它提供了向以下来源和目标读取和写入XML的方法。
- 字符串
- 字节[]
- java.io.File
- java.io.InputStream和java.io.OutputStream
- java.io.Reader和java.io.Writer
//Write to String
String xml = xmlMapper.writeValueAsString(pojo);
//Write to file
xmlMapper.writeValue(new File("data.xml"), pojo);
//Read from String
Pojo pojo = xmlMapper.readValue(xmlString, Pojo.class);
//Read from File
Pojo pojo = xmlMapper.readValue(new File("data.xml"), Pojo.class);
使用它的enable()
和disable()
方法,我们可以开启和关闭各种特定于XML marshalling和unmarshalling的行为,比如。
- 处理空值和空值。
- 处理日期和时间值
- 处理枚举值
- 处理元素排序
- 漂亮的打印,等等。
xmlMapper.enable(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS);
xmlMapper.enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
xmlMapper.disable(DeserializationFeature.ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT);
xmlMapper.disable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
3.用Jackson注解定制转换
让我们以Article类为例。我们将首先检查为其实例生成的默认XML,然后我们将通过对Article类应用注释来定制XML。
class Article {
private Long id;
private String title;
private List<String> tags;
//Constructors, getters, setters and toString method
}
在下面的例子中,我们使用同样的代码进行marshalling。
XmlMapper xmlMapper = new XmlMapper();
Article article = new Article(1L, "Test Title", List.of("Tag1", "Tag2"));
String articleXml = xmlMapper.writeValueAsString(article);
System.out.println(articleXml);
3.1.没有注解的默认XML
默认的XML从类和成员字段名中获取XML标签名,包括大写。
<Article><id>1</id><title>Test Title</title><tags><tags>Tag1</tags><tags>Tag2</tags></tags></Article>
3.2.根元素的名称
使用@JacksonXmlRootElement
来定制根元素的名称。
@JacksonXmlRootElement(localName = "article")
class Article { ... }
检查一下生成的XML放出。
<article>....</article>
3.3.制作XML属性
使用@JacksonXmlProperty(isAttribute = true)
,将一个字段标记为XML属性,而不是XML元素。
@JacksonXmlRootElement(localName = "article")
class Article {
@JacksonXmlProperty(isAttribute = true)
private Long id;
...
}
查看生成的XML输出。
<article id="1">...</article>
3.4.定制列表
使用@JacksonXmlElementWrapper
,在一个列表类型上,创建列表包装元素。可以使用@JacksonXmlProperty
来定制各个元素。
@JacksonXmlRootElement(localName = "article")
class Article {
@JacksonXmlProperty(isAttribute = true)
private Long id;
private String title;
@JacksonXmlElementWrapper(localName = "tags")
@JacksonXmlProperty(localName = "tag")
private List<String> tags;
...
}
查看生成的XML输出。
<article id="1"><title>Test Title</title><tags><tag>Tag1</tag><tag>Tag2</tag></tags></article>
4.漂亮地打印XML输出
如果我们想漂亮地打印XML输出,我们可以在XMLMapper上打开SerializationFeature.INDENT_OUTPUT。
XmlMapper xmlMapper = new XmlMapper();
xmlMapper.enable(SerializationFeature.INDENT_OUTPUT);
Article article = new Article(1L, "Test Title", List.of("Tag1", "Tag2"));
String articleXml = xmlMapper.writeValueAsString(article);
System.out.println(articleXml);
它将打印以下的 XML。
<article id="1">
<title>Test Title</title>
<tags>
<tag>Tag1</tag>
<tag>Tag2</tag>
</tags>
</article>
5.总结
这个Jackson教程用简单易行的例子教我们如何将Java对象序列化和反序列化为XML文档。我们学会了自定义和使用XmlMapper
类来控制转换过程中的特定行为。
学习愉快!!
这个帖子对你有帮助吗?
如果你喜欢这个帖子,请告诉我们。这是我们改进的唯一方法。
有
没有