You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jackson序列化列表为XML与JSON时的差异化格式适配问题

方案1:添加@JsonValue注解(推荐,无需调整序列化逻辑)

直接在DeviceWrapper类的devices字段上添加Jackson提供的@JsonValue注解即可,该注解仅作用于JSON序列化,不会影响XML的输出结构:

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

@JacksonXmlRootElement(localName = "devices")
class DeviceWrapper {

    @JsonValue
    @JacksonXmlProperty(localName = "device")
    @JacksonXmlElementWrapper(useWrapping = false)
    List<Device> devices;
}

最终效果完全符合需求:

  • XML序列化:保留原有的<devices>根节点、<device>子节点结构,输出和当前预期一致
  • JSON序列化:直接返回devices字段对应的List集合,输出为纯数组,无外层对象包裹

如果需要支持JSON反序列化为DeviceWrapper对象,可以补充添加带@JsonCreator注解的构造函数:

import com.fasterxml.jackson.annotation.JsonCreator;

@JacksonXmlRootElement(localName = "devices")
class DeviceWrapper {

    @JsonValue
    @JacksonXmlProperty(localName = "device")
    @JacksonXmlElementWrapper(useWrapping = false)
    List<Device> devices;

    @JsonCreator
    public DeviceWrapper(List<Device> devices) {
        this.devices = devices;
    }
    
    // 保留无参构造函数供XML反序列化使用
    public DeviceWrapper() {}
}

方案2:序列化时分别处理(无需修改POJO注解)

如果不想改动现有POJO的注解配置,也可以在序列化阶段分逻辑处理:

  • 序列化为XML时,直接传入DeviceWrapper实例进行序列化
  • 序列化为JSON时,先调用deviceWrapper.getDevices()获取设备List集合,再序列化该集合对象即可得到纯数组输出

内容的提问来源于stack exchange,提问作者Roman A Musiy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 14:09:02