一、介绍
最近碰到需要用 XML 进行传参的场景,整理了一下基于 Jackson 来做 XML 转换中碰到的问题,方便后期查阅。
二、简单转换
1.引入包
Maven
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.16.1</version>
</dependency>
Gradle
implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-xml', version: '2.16.1'
2.使用 XmlMapper
XmlMapper xmlMapper = new XmlMapper();
Order order = new Order();
order.setOrderId("123");
String xmlString = xmlMapper.writeValueAsString(order);
输出
<Order>
<orderId>123</orderId>
</Order>
这时候,XML 就完成转换了。
当然如果到这里就结束,就没有必要写这一篇文章了。下面是在对接中碰到的实际场景。
三、使用场景
实际场景我将用 JSON 来展示我的转换参数,方便大家查看
1. 包装值只能是 Request
如果你看过阿里奇门的请求参数,你就会发现他们的外层通常都是一个Request对请求参数进行包裹,就像下面这样
<Request>
<orderId>123</orderId>
</Request>
如何把我们的实体名称换成 Request 呢?改类名吗?
当然不是,这时候就需要用到 JackSon 提供的 @JacksonXmlRootElement
注解,给Order类指定对应的名字
@JacksonXmlRootElement(localName = "Request")
public class Order {
private String orderId;
private String orderName;
private List<Good> goods;
}
此时转换成 XML 就变成了这样
<Request>
<orderId>123</orderId>
<orderName></orderName>
</Request>
2. 有数组
还是上面这个 Order 实体,他下面包含一个 Goods 的数组参数,json 参数如下
{
"goods": [
{
"name": "乐高积木",
"num": 1,
"price": "123"
},
{
"name": "拍立得",
"num": 1,
"price": "200"
}
],
"orderId": "123",
"orderName": ""
}
如果直接转换 Xml 是这样的
<Request>
<orderId>123</orderId>
<orderName></orderName>
<goods>
<goods>
<name>乐高积木</name>
<price>123</price>
<num>1</num>
</goods>
<goods>
<name>拍立得</name>
<price>200</price>
<num>1</num>
</goods>
</goods>
</Request>
这里 goods 里面还包裹了 goods。而我们想要的显然是下面这种样子的 XML
<Request>
<orderId>123</orderId>
<orderName></orderName>
<goods>
<!--注意看这里-->
<good>
<name>乐高积木</name>
<price>123</price>
<num>1</num>
</good>
<good>
<name>拍立得</name>
<price>200</price>
<num>1</num>
</good>
</goods>
</Request>
此时我们需要在 Order 实体中,使用@JacksonXmlProperty
和 @JacksonXmlElementWrapper
来给数组去指定参数
@JacksonXmlRootElement(localName = "Request")
public class Order {
private String orderId;
private String orderName;
@JacksonXmlProperty(localName = "good")
@JacksonXmlElementWrapper(localName = "goods")
private List<Good> goods;
}
这两个注解都是需要的,加上注解之后,XML 终于变成了我们想要的参数!
评论区