杰克逊--将XML编入和解除编入Java对象的程序

248 阅读3分钟

学习使用Jackson将Java对象转换为XML从XML文档转换为Java对象。如果我们想在没有JAXB的情况下将一个Java对象转换为XML,Jackson是一个很好的解决方案。

只是要重申一下,marshalling是将Java对象转换为XML文档的过程。Unmarshalling是将XML文档读入Java对象的过程。

目录

  1. 1.设置Jackson
  2. 2.XMLMapper类
  3. 3.用Jackson注解定制转换
  4. 4.漂亮地打印XML输出
  5. 5.总结

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.InputStreamjava.io.OutputStream
  • java.io.Readerjava.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 类来控制转换过程中的特定行为。

学习愉快!!

Github上的源代码

这个帖子对你有帮助吗?

如果你喜欢这个帖子,请告诉我们。这是我们改进的唯一方法。

没有

相关帖子。

  1. 淘宝网上卖的是什么?
  2. [Solved] org.codehaus.jackson.map.JsonMappingException:没有找到适合该类型的构造函数
  3. 杰克逊--将JSON转换为Map,将Map转换为JSON
  4. 杰克逊 - 读取和写入JSON
  5. Java字符串到XML--解析字符串到XML DOM实例
  6. Java XML to String - Write XML Object to File Example