侧边栏壁纸
  • 累计撰写 58 篇文章
  • 累计创建 67 个标签
  • 累计收到 1 条评论

Jackson XML 使用

lihaocheng
2024-02-25 / 0 评论 / 0 点赞 / 112 阅读 / 788 字
温馨提示:
晚上记得开启夜间模式哦

一、介绍

最近碰到需要用 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 终于变成了我们想要的参数!

0

评论区