Jackson 生成xml格式文件

Jackson是java应用中流行的操作Json工具库,很快成为Java生态中事实标准,Spring boot默认也使用Jackson。从版本2开始,支持json的同时引入成熟的xml实现。

1. 环境依赖

增加Jackson xml 模块,仅需要一个依赖:

<dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId><version>2.9.0</version>
</dependency>

Gradle版本:

compile "com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.9.0"

1.1 配置Jackson Xml 模块

Jackson通常使用 ObjectMapper实例;如果要使用xml相关操作,则需要使用 XmlMapper类,其是 ObjectMapper类的派生类,两者使用方式几乎一致。

最简单方式定义:

ObjectMapper objectMapper = new XmlMapper();

也可以增加一些通用配置:

JacksonXmlModule xmlModule = new JacksonXmlModule();
xmlModule.setDefaultUseWrapper(false);
ObjectMapper objectMapper = new XmlMapper(module);

对2.9版本,仅对xml有效的配置包括:

  • setDefaultUseWrapper – 定义默认情况下是否为未带注释的列表属性使用包装器。即对列表属性生成一个外层元素。
  • setXMLTextElementName – 当处理字符串数据时使用虚拟名称。

1.2 Spring Boot配置

由于Spring Boot默认没有暴露XmlMapper作为Bean,因为会与 ObjectMapper冲突,XmlMapper是其子类。但可以使用MappingJackson2XmlHttpMessageConverter 信息转换Bean进行获取。配置示例:

@Component
public class MetaConvert implements IMetaConvert{private ObjectMapper xmlMapper;public MetaConvert(MappingJackson2XmlHttpMessageConverter xmlConverter) {xmlMapper = xmlConverter.getObjectMapper();}@Overridepublic String convertMetaToXml(Object metaInfo) {ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();try {xmlMapper.writeValue(byteArrayOutputStream, metaInfo);} catch (IOException e) {log.error(e.getMessage());throw MetaFileException.of(e.getMessage());}return byteArrayOutputStream.toString();}}

2. 处理xml

Jackson可以很轻松处理Json,利用一些注解进行标识。XmlMapperObjectMapper的子类,仅为了处理xml,这意味着Api完全相同,可以直接使用。

2.1 写Xml

写Xml使用Jackson提供的多个重载方法 writeValue()。举例,序列化对象至xml可以简单使用 writeValueAsString方法:

String xml = objectMapper.writeValueAsString(input);

其他几个方法:

  • Writing to a String
  • Writing to a Byte Array
  • Writing to a java.io.OutputStream – 如:网络连接的流
  • Writing to a java.io.Writer
  • Writing to a java.io.File

2.2 读Xml

刚才我们看到Jackson可以很好地处理写操作,它也可以处理读操作,同样利用多个重载方法 readValue()方法。举例,从输入流中读xml生成Java Bean:

MyBean bean = objectMapper.readValue(inputStream, MyBean.class);

其他重载方法有:

  • Reading from a String
  • Reading from a Byte Array
  • Reading from a java.io.InputStream – 如:网络连接的流
  • Reading from a java.io.Reader
  • Reading from a java.io.File

3. Jackson 序列化注解

Jackson XML模块支持Jackson提供的用于注释pojo的所有注释。这意味着我们有一组bean和注释,并根据ObjectMapper实例选择是获得XML还是JSON。在构造代码时,这是一个巨大的好处,因为不再担心在表示相同数据的不同bean之间进行转换,从而获得不同的序列化格式。

举例:

@JsonPropertyOrder({"age", "id", "name"})
public class Person {@JsonProperty("_id")private String id;private String name;private int age;@JsonIgnoreprivate String note;
}

生成json:

{"age":4,"_id":"12345","name":"George"
}

xml格式:

<Person><age>4</age><_id>12345</_id><name>George</name>
</Person>

3.1 针对xml的注解

Jackson Xml 模块增加了对xml特性支持的属性。这些注解用于控制元素(包括根元素)的xml命名空间、本地名称,字段是否被渲染为元素或普通文本,元素内容是否被渲染为CData 包装,集合属性是否使用包装元素等。下面针对常用注解进行分别说明。

@JacksonXmlProperty

@JacksonXmlProperty可以用在bean的任何字段上,控制渲染元素的一些细节属性。通过该注解可以设置命名控件、本地名称、是否被序列化为元素或属性。举例如下:

public class Person {@JacksonXmlProperty(isAttribute = true, namespace = "urn.stackify.jacksonxml", localName = "_id")private String id;@JacksonXmlProperty(namespace = "urn.stackify.jackson")private String name;private String note;
}

输出结果:

<Person xmlns:wstxns1="urn.stackify.jacksonxml" wstxns1:_id="12345"><wstxns2:name xmlns:wstxns2="urn.stackify.jackson">Graham</wstxns2:name><note>Hello</note>
</Person>

@JacksonXmlRootElement

@JacksonXmlRootElement与上面提及的注解类似,但作用与整个文档的根元素。可设定命名空间和本地名称,根元素不会作为属性序列化。我们看下面Person POJO示例:

@JacksonXmlRootElement(namespace = "urn.stackify.jacksonxml", localName = "PersonData")
public class Person {private String id;private String name;private String note;
}

输出结果:

<PersonData xmlns="urn.stackify.jacksonxml"><id xmlns="">12345</id><name xmlns="">Graham</name><note xmlns="">Hello</note>
</PersonData>

@JacksonXmlText

我们在看看 @JacksonXmlText注解。其表示属性被渲染为普通文本,无需额外元素包裹。举例:

public class Person {private String id;private String name;@JacksonXmlTextprivate String note;
}

输出结果:

<Person><id>12345</id><name>Graham</name>Hello
</Person>

当然你要谨慎使用该注解,确保生成xml为有效格式。

@JacksonXmlCData

@JacksonXmlCData注解表示其内容不被xml解析,一般和@JacksonXmlText一起使用。请看示例:

public class Person {private String id;@JacksonXmlCDataprivate String name;@JacksonXmlText@JacksonXmlCDataprivate String note;
}

输出结果为:

<Person><id>12345</id><name><![CDATA[Graham]]></name><![CDATA[Hello]]>
</Person>

@JacksonXmlElementWrapper

@JacksonXmlElementWrapper 注解覆盖setDefaultUseWrapper的确省设置。其能够让集合属性决定是否使用包装元素,并且也可以控制包装元素的本地名称和命名空间。

使用包装元素则增加额外元素包括所有集合元素,反之,直接列出所有集合元素:

class Wrapper {@JacksonXmlElementWrapper(localName = "list")private List names;
}

输出结果:

<Wrapper><list><names>John</names><names>Paul</names><names>George</names><names>Ringo</names></list>
</Wrapper>

如果设置不用包装元素:

@JacksonXmlElementWrapper(useWrapping = false)

输出结果:

<Wrapper><names>John</names><names>Paul</names><names>George</names><names>Ringo</names>
</Wrapper>

4. 总结

Jackson可以灵活地采用相同方式处理JSON和XML数据,Jackson Xml 模块还增加xml特有的处理方式和注解。

Jackson 生成xml格式文件相关推荐

  1. 【csv文件转xml文件】Excel表格数据快速批量生成xml格式文件

    使用背景: 使用场景举例:数据集标签处理 有时候我们需要将固定格式的Excel表格文件(csv文件)转换为xml文件使用,例如我们在目标检测实验当中我们需要制作数据集Pascal VOC格式的标签文件 ...

  2. java使用jdom生成xml格式文件

    本文生成xml使用的工具是jdom.jar,下载地址如下: 链接:https://eyun.baidu.com/s/3slyHgnj 密码:0TXF 生成之后的文档格式类型,就如上面的图片一样,简单吧 ...

  3. java生成XML格式文件,导入MS Project生成甘特图

    公司需求需要生成如如下图所示的project甘特图,开发语言是java,网上找了很久也没有找到可以利用java生成这种甘特图的方案.退而求其次,改变需求生成可以导入project的xml文件. 首先用 ...

  4. voc数据集格式转换为coco数据集格式+修改xml格式文件

    voc数据集格式转换为coco格式+修改xml格式文件中部分内容 voc数据集格式→coco数据集格式 修改xml格式文件中部分内容 voc数据集格式→coco数据集格式 下面这份代码只需修改文件所在 ...

  5. XML格式文件详解及Java解析XML文件内容方法

    XML格式文件详解 1.概述 XML,即可扩展标记语言,XML是互联网数据传输的重要工具,它可以跨越互联网任何的平台,不受编程语言和操作系统的限制,可以说它是一个拥有互联网最高级别通行证的数据携带者. ...

  6. 【Java】生成 .json格式文件工具类

    package com.glodon.kgb.utils.json;import java.io.File; import java.io.FileOutputStream; import java. ...

  7. python修改文件格式为unix_软件测试技术之如何用python在Windows系统下,生成UNIX格式文件...

    本文将带你了解软件测试技术之如何用python在Windows系统下,生成UNIX格式文件,希望对大家学测试技术有所帮助 如何用python在Windows系统下,生成UNIX格式文件 平时测试工作中 ...

  8. python亿级mysql数据库导出_Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法...

    本文实例讲述了python实现将MySQL数据库表中的数据导出生成csv格式文件的方法.分享给大家供大家参考,具体如下: #!/usr/bin/env python # -*- coding:utf- ...

  9. python获取的html转换为json,python读取XML格式文件并转为json格式

    XML文件如下: 红楼梦书名> 曹雪芹作者> 描述贾宝玉和林黛玉的爱情故事主要内容> 人民文学出版社出版社> 图书> 一.python读取XML格式文件代码: impor ...

  10. python处理文本文件实现生成指定格式文件的方法

    python处理文本文件实现生成指定格式文件的方法 关于python处理文本文件实现生成指定格式文件,很多朋友都不知道该怎么弄. 下面是具体代码,希望对大家有帮助 可以在下面复制: import os ...

最新文章

  1. redis 未授权访问利用 两种方式
  2. Redis-Session无状态会话技术
  3. java list适配器_详解listview的四种适配器模式
  4. [机器学习] Boosting算法4 --- LightGBM介绍与分布式
  5. ps一点等于多少厘米_劝告大家:女人40岁后,体重多少算正常?太瘦也不好
  6. WP7中对ListBox的ItemTemplate中子元素的后台操作
  7. day10 java的this关键字
  8. android 指定资源id,Android 通过名称获取资源ID
  9. IDEA商店无法打开的解决方法
  10. python 图像压缩pca_在Python中使用K-Means聚类和PCA主成分分析进行图像压缩
  11. 【BZOJ3505】[Cqoi2014]数三角形 组合数
  12. 常见物质相对介电常数(室温,频率低于1kHz)
  13. SaaS行业的六大安全问题
  14. VB.NET 通过vbs发送微信消息
  15. 遇到一点难题,请大拿帮忙看一下 万分感谢
  16. jenkins 下自动构建 生成二维码(不使用蒲公英 fir)
  17. 掌握这9个单行代码技巧!你也能写出『高端』Python代码 ⛵
  18. 可转债第一课:神奇的可转债
  19. 第24章 让唯美的雪花飘扬——三维粒子系统的实现
  20. 未来站在中国这一边(读后感)

热门文章

  1. c语言头文件下载大全,求C语言头文件下载?
  2. 破解TexturePacker加密资源
  3. LaTex写实验报告
  4. 如何修改Android APP的图标和名字
  5. Idea 2020 找不到或无法安装官方汉化包解决方案
  6. Excel中关于数组函数的研究
  7. 巴特沃斯低通滤波器 matlab,基于MATLAB做巴特沃斯低通滤波器..doc
  8. WINRAR弹出激活框解决
  9. BScroll 实时监听滚动位置
  10. MagicDraw建模显示中文问题