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
相关产品推荐
相关产品推荐

