使用Jackson XmlMapper时如何移除Credentials的XML包装节点?
移除Jackson XML序列化中的
credentials包装节点 已经通过XmlMapper.builder().defaultUseWrapper(false)禁用了默认包装,但XML输出中仍保留credentials包装节点,无法实现嵌套字段的扁平化输出。
相关代码
UserDAO类
public class UserDAO { @JacksonXmlProperty(isAttribute = true) private int id; private Credentials credentials; @JacksonXmlProperty(localName = "todos") private TasksDAO tasks; // getter, setter }
Credentials类
public class Credentials { @JacksonXmlProperty(localName = "name") @JsonProperty("name") private String username; private String password; // getter, setter }
XmlMapper配置
XmlMapper .builder() .defaultUseWrapper(false) .addModule(new JavaTimeModule()) .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) .build()
当前与期望输出
当前XML输出
<users> <user id="1"> <credentials> <password>123</password> <name>Steve</name> </credentials> <todos/> </user> </users>
期望XML输出
<users> <user id="1"> <password>123</password> <name>Steve</name> <todos/> </user> </users>
解决方案
defaultUseWrapper(false)仅用于禁用集合类型的默认包装节点(比如List字段自动生成的包装标签),对单个嵌套对象不生效。要扁平化嵌套的Credentials对象,需要在UserDAO的credentials字段上添加@JacksonXmlUnwrapped注解:
修改后的UserDAO类:
public class UserDAO { @JacksonXmlProperty(isAttribute = true) private int id; @JacksonXmlUnwrapped // 添加该注解实现字段扁平化 private Credentials credentials; @JacksonXmlProperty(localName = "todos") private TasksDAO tasks; // getter, setter }
说明
@JacksonXmlUnwrapped是Jackson XML模块提供的注解,作用是将嵌套对象的字段直接序列化到父节点中,不会生成嵌套对象对应的包装标签。- 若使用Jackson 2.9及更早版本,可结合
@JsonUnwrapped一起使用;新版本中@JacksonXmlUnwrapped已能独立处理XML场景的扁平化需求。
内容的提问来源于stack exchange,提问作者Ero Stefano
相关产品推荐
相关产品推荐

