Jackson 将列表序列化为 xml 和 json
Posted
技术标签:
【中文标题】Jackson 将列表序列化为 xml 和 json【英文标题】:Jackson serialize list to xml & json 【发布时间】:2021-12-10 01:28:02 【问题描述】:我有一个要序列化为 json 和 XML 的类:
@JacksonXmlRootElement(localName = "devices")
class DeviceWrapper // <-- this class is intended to provide root xml name
@JacksonXmlProperty(localName = "device")
@JacksonXmlElementWrapper(useWrapping = false)
List<Device> devices
设备类只是 POJO:
class Device
String field1;
String field2;
...
将 DeviceWrapper 序列化为 XML 工作正常:
<?xml version="1.0"?>
<devices>
<device>
<field1>value</field1>
<field2>value</field2>
</device>
<device>
<field1>value</field1>
<field2>value</field2>
</device>
...
</devices>
但是当我尝试将 DeviceWrapper 序列化为 json 时,我得到:
"devices": [
"field1": "val",
"field2": "val"
,
"field1": "val",
"field2": "val"
...
]
但我只想获取设备值列表:
[
"field1": "val",
"field2": "val"
,
"field1": "val",
"field2": "val"
,
...
]
即我想看到devices
仅用于 xml 作为列表的分组元素,并且不想在 json 的情况下看到它。怎么做?
【问题讨论】:
【参考方案1】:欢迎来到 Stack Overflow,使用 @JsonValue
注释注释您的 List<Device> devices
即可解决您的问题,但由于存在 xml 注释,这是不可能的:解决方法是使用 ObjectMapper#addMixIn
方法。如果您定义如下接口:
public class DeviceWrapperModelMixIn
@JsonValue
List<Device> devices;
您可以将其添加到您的 objectmapper 并获得预期的结果,而无需更改原始类代码:
mapper.addMixIn(DeviceWrapper.class, DeviceWrapperModelMixIn.class);
//it prints ["field1":"val","field2":"val","field1":"val","field2":"val"]
System.out.println(mapper.writeValueAsString(wrapper));
【讨论】:
以上是关于Jackson 将列表序列化为 xml 和 json的主要内容,如果未能解决你的问题,请参考以下文章
使用 Jackson XmlMapper 将 XML 反序列化为 POJO
Jackson:为 Map 数据结构注册自定义 XML 序列化程序