导读:本期聚焦于小伙伴创作的《如何使用 Jackson XML 为集合元素自定义标签名称》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何使用 Jackson XML 为集合元素自定义标签名称》有用,将其分享出去将是对创作者最好的鼓励。

在使用Jackson XML进行Java对象与XML数据转换的场景中,默认的集合元素标签名称通常是基于集合泛型类型生成的,很多时候无法满足项目约定的XML格式规范,因此需要手动自定义集合元素的标签名称。

如何使用 Jackson XML 为集合元素自定义标签名称

核心注解介绍

Jackson XML提供了@JacksonXmlElementWrapper@JacksonXmlProperty两个核心注解来实现集合元素标签的自定义,二者配合使用可以完成大部分场景的需求。

  • @JacksonXmlElementWrapper:用于指定集合外层包裹元素的标签名称,同时可以设置是否生成外层包裹标签。
  • @JacksonXmlProperty:用于指定当前元素(包括集合中的子元素)的标签名称、命名空间等属性。

基础使用步骤

1. 添加依赖

首先需要在项目中引入Jackson XML的相关依赖,以Maven项目为例,在pom.xml中添加如下配置:

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

2. 定义实体类

假设我们有一个用户列表的场景,需要将用户集合序列化为指定标签名称的XML,首先定义用户实体类:

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;

public class User {
    @JacksonXmlProperty(localName = "user_id")
    private Long id;

    @JacksonXmlProperty(localName = "user_name")
    private String name;

    // 构造方法、getter、setter省略
}

接下来定义包含用户集合的父实体类,在这里配置集合相关的标签名称:

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import java.util.List;

public class UserGroup {
    // 指定外层包裹标签名为user_list,集合中的每个子元素标签名为single_user
    @JacksonXmlElementWrapper(localName = "user_list")
    @JacksonXmlProperty(localName = "single_user")
    private List<User> users;

    @JacksonXmlProperty(localName = "group_name")
    private String groupName;

    // 构造方法、getter、setter省略
}

3. 执行序列化测试

编写测试代码验证自定义标签是否生效:

import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) throws Exception {
        XmlMapper xmlMapper = new XmlMapper();
        UserGroup group = new UserGroup();
        group.setGroupName("测试用户组");

        List<User> users = new ArrayList<>();
        User user1 = new User();
        user1.setId(1L);
        user1.setName("张三");
        User user2 = new User();
        user2.setId(2L);
        user2.setName("李四");
        users.add(user1);
        users.add(user2);
        group.setUsers(users);

        String xml = xmlMapper.writeValueAsString(group);
        System.out.println(xml);
    }
}

运行上述代码后,输出的XML内容如下:

<UserGroup>
    <user_list>
        <single_user>
            <user_id>1</user_id>
            <user_name>张三</user_name>
        </single_user>
        <single_user>
            <user_id>2</user_id>
            <user_name>李四</user_name>
        </single_user>
    </user_list>
    <group_name>测试用户组</group_name>
</UserGroup>

无外层包裹标签的场景

如果不需要集合的外层包裹标签,可以将@JacksonXmlElementWrapperuseWrapping属性设置为false:

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import java.util.List;

public class UserGroupNoWrapper {
    // 不生成外层包裹标签,直接生成多个single_user标签
    @JacksonXmlElementWrapper(useWrapping = false)
    @JacksonXmlProperty(localName = "single_user")
    private List<User> users;

    @JacksonXmlProperty(localName = "group_name")
    private String groupName;

    // 构造方法、getter、setter省略
}

此时序列化后的XML会去掉user_list外层标签,直接输出多个single_user子元素。

注意事项

  • 如果集合泛型是自定义类型,@JacksonXmlPropertylocalName属性指定的是集合中每个元素的标签名,而@JacksonXmlElementWrapper指定的是集合整体的外层标签名。
  • 反序列化时,相同的注解配置也会生效,Jackson XML会根据自定义标签名匹配对应的集合元素。
  • 如果同时存在多个集合字段,需要为每个集合字段单独配置对应的注解,避免标签名称冲突。

Jackson_XML集合元素自定义标签名称XML序列化Java修改时间:2026-06-21 03:33:33

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。