讲师中心 微信公众号
AI工具推荐 视频效率加速

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

冬墨酱_9755

冬墨酱_9755

发布时间:2026-02-23 10:53:00

|

434人浏览过

|

来源于php中文网

原创

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

本文详解如何通过 Jackson 的 @JacksonXmlRootElement、@JacksonXmlElementWrapper 等注解精准控制 XML 序列化时的标签命名,特别是解决集合项(如 内部的 )与包装容器标签同名导致的命名冲突问题。

本文详解如何通过 jackson 的 `@jacksonxmlrootelement`、`@jacksonxmlelementwrapper` 等注解精准控制 xml 序列化时的标签命名,特别是解决集合项(如 `` 内部的 ``)与包装容器标签同名导致的命名冲突问题。

在使用 Jackson Dataformat XML(jackson-dataformat-xml)将 Java 对象序列化为 XML 时,集合字段(如 List)默认会生成同名嵌套标签:容器标签(wrapper)和元素标签(item)均取自字段名(如 albums),导致 这类不符合语义的结构。要实现语义清晰、符合 XML 设计惯例的输出(如 ),需显式指定元素级标签名——这正是本文的核心目标。

✅ 正确做法:组合使用 @JacksonXmlElementWrapper 与 @JacksonXmlRootElement

关键在于分离容器标签与元素标签的命名职责:

  • @JacksonXmlElementWrapper 控制集合容器标签(即 );
  • @JacksonXmlRootElement(或更推荐的 @JacksonXmlProperty(localName = "...") 配合构造器/字段)控制单个集合项的根标签名(即 )。

⚠️ 注意:@JacksonXmlRootElement 不能直接标注在构造器上(如答案中所示用法是错误且无效的)。Jackson 不支持在构造器上使用该注解;正确方式是将其标注在类声明处,或更灵活、更推荐地——使用 @JacksonXmlProperty 配合 localName 在 getter 方法上显式指定元素标签名。

以下是修正后的完整、可运行示例:

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.dataformat.xml.JacksonXmlModule;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator;

import java.util.ArrayList;
import java.util.List;

// Artist 类:使用 @JacksonXmlElementWrapper 指定容器标签为 "albums"
public class Artist {
    private String name;
    @JacksonXmlElementWrapper(localName = "albums") // ← 容器标签名
    @JsonProperty("album") // ← 关键!指定集合中每个 Album 实例的 XML 元素名
    private List<Album> albums = new ArrayList<>();

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    public List<Album> getAlbums() { return albums; }
    public void setAlbums(List<Album> albums) { this.albums = albums; }
}

// Album 类:无需额外注解,其字段通过 getter 上的 @JacksonXmlProperty 控制属性
public class Album {
    private String name;
    private int year;

    public Album() {} // 必须提供无参构造器(Jackson 反序列化所需)

    public Album(String name, int year) {
        this.name = name;
        this.year = year;
    }

    // 使用 @JacksonXmlProperty(isAttribute = true) 将 name 和 year 输出为属性
    @JacksonXmlProperty(isAttribute = true)
    public String getName() { return name; }

    @JacksonXmlProperty(isAttribute = true)
    public int getYear() { return year; }
}

✅ 序列化代码示例

public class XmlRenameDemo {
    public static void main(String[] args) throws Exception {
        XmlMapper xmlMapper = new XmlMapper();
        // 启用缩进便于阅读(非必需)
        xmlMapper.enable(ToXmlGenerator.Feature.WRITE_XML_DECLARATION);
        xmlMapper.enable(SerializationFeature.INDENT_OUTPUT);

        Artist artist = new Artist();
        artist.setName("Some name");
        artist.getAlbums().add(new Album("Some name1", 1985));
        artist.getAlbums().add(new Album("Some name2", 1986));

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

✅ 输出结果(符合预期):

<?xml version='1.0' encoding='UTF-8'?>
<Artist>
  <name>Some name</name>
  <albums>
    <album name="Some name1" year="1985"/>
    <album name="Some name2" year="1986"/>
  </albums>
</Artist>

? 核心要点总结

注解 作用位置 推荐用法 说明
@JacksonXmlElementWrapper(localName = "xxx") 集合字段或 getter 上 ✅ 必须用于控制容器标签(如 ) 若省略,Jackson 默认使用字段名作为 wrapper 标签名
@JsonProperty("xxx")(在集合 getter 上) getAlbums() 方法上 ✅ 最推荐方式,明确指定元素标签名(如 ) 替代过时/易混淆的 @JacksonXmlRootElement 用法
@JacksonXmlProperty(isAttribute = true) 属性 getter 上 ✅ 用于生成 XML 属性(name="...") 如本例中的 name 和 year

⚠️ 常见误区与注意事项

  • ❌ 不要在构造器上使用 @JacksonXmlRootElement —— Jackson 完全忽略此类注解,且可能引发 InvalidDefinitionException。
  • ❌ 不要仅依赖 @JacksonXmlRootElement(localName = "album") 标注在 Album 类上 —— 它仅影响 Album 单独序列化为根元素时(如 xmlMapper.writeValueAsString(album)),对集合内嵌场景无效。
  • ✅ 务必为 Album 提供无参构造器,否则反序列化会失败。
  • ✅ 若需兼容反序列化,确保 @JsonProperty("album") 同时作用于 getter 和 setter(或使用 Lombok @Getter/@Setter 自动生成)。

通过合理组合 @JacksonXmlElementWrapper 与 @JsonProperty,即可精准、可靠地控制 Jackson XML 的标签命名逻辑,生成语义清晰、结构规范的 XML 文档。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

4924

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

6397

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

2582

2024.11.28

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

0

2026.11.03

Docker Desktop镜像构建教程
Docker Desktop镜像构建教程

想使用Docker Desktop将本地项目构建成Docker镜像?本专题围绕镜像构建的实际操作展开,介绍Dockerfile编写、构建命令使用、镜像标签设置和构建日志查看等内容,同时整理镜像无法生成、依赖安装失败及构建缓存异常等问题的排查思路。

0

2026.11.03

Docker Desktop容器创建指南
Docker Desktop容器创建指南

本专题聚焦Docker Desktop容器创建与运行配置,介绍通过本地镜像或远程镜像创建容器的方法,以及容器启动、终端访问、日志查看和基础管理等操作。针对端口冲突、参数配置不当、容器无法启动等情况,也整理了相应的排查方向。

0

2026.11.03

Tailwind CSS 如何制作导航栏和卡片
Tailwind CSS 如何制作导航栏和卡片

用 Tailwind CSS 制作导航栏和卡片,可先搭建语义化结构,再组合 Flex、Grid、间距、圆角与阴影类。这里整理横向导航、移动端菜单、卡片网格及悬停效果的相关文章,帮助你把常见页面组件做得清晰且适配不同屏幕。

0

2026.11.03

Tailwind CSS 响应式布局怎么写
Tailwind CSS 响应式布局怎么写

Tailwind CSS 响应式布局通常从移动端样式写起,再用 sm、md、lg 等前缀调整不同屏幕宽度下的网格、间距和导航。本专题整理断点配置、Grid 与 Flex 自适应布局及常见溢出问题,帮助你逐步完成多设备适配。

0

2026.11.03

Tailwind CSS 常用类名怎么记
Tailwind CSS 常用类名怎么记

Tailwind CSS 类名很多,先按布局、间距、文字、颜色和状态分组记忆,再通过官方文档检索具体写法。本专题结合类名排序、动态拼接失效、自定义实用类等问题,帮助你建立常用类名的速查方法。

0

2026.11.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn