如何使用Jackson XmlMapper处理含混合内容的XML序列化
使用Jackson XmlMapper生成含混合内容的XML
要生成你需要的混合内容XML,核心是利用Jackson XML模块的@JacksonXmlText注解处理元素内的文本内容,同时定义嵌套的子元素对象。
1. 引入Jackson XML依赖
如果用Maven,在pom.xml中添加:
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>2.15.2</version> <!-- 使用最新稳定版即可 --> </dependency>
2. 定义对应的Java类
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlText; // 顶层Foo类 public class Foo { @JacksonXmlProperty(localName = "bar") private Bar bar; // 构造器、getter/setter public Foo() {} public Foo(Bar bar) { this.bar = bar; } public Bar getBar() { return bar; } public void setBar(Bar bar) { this.bar = bar; } } // Bar类,包含混合内容 public class Bar { @JacksonXmlProperty(localName = "a") private A a; @JacksonXmlProperty(localName = "b") private B b; @JacksonXmlText // 标记该字段为元素的文本内容 private String text; // 构造器、getter/setter public Bar() {} public Bar(A a, B b, String text) { this.a = a; this.b = b; this.text = text; } public A getA() { return a; } public void setA(A a) { this.a = a; } public B getB() { return b; } public void setB(B b) { this.b = b; } public String getText() { return text; } public void setText(String text) { this.text = text; } } // A类(对应空元素<a>) public class A {} // B类(对应空元素<b>) public class B {}
3. 序列化测试代码
import com.fasterxml.jackson.dataformat.xml.XmlMapper; import java.io.IOException; public class XmlGenerator { public static void main(String[] args) throws IOException { XmlMapper xmlMapper = new XmlMapper(); xmlMapper.enable(com.fasterxml.jackson.core.JsonGenerator.Feature.INDENT_OUTPUT); // 格式化输出 // 构建对象 Foo foo = new Foo(new Bar(new A(), new B(), "Some text")); // 序列化为XML字符串 String xml = xmlMapper.writeValueAsString(foo); System.out.println(xml); } }
关键说明
@JacksonXmlText是实现混合内容的核心,它会将标注的字段值直接作为父元素(这里是<bar>)的文本内容,和其他子元素<a>、<b>混合排列。@JacksonXmlProperty(localName = "...")用来指定XML元素的名称,确保和目标结构一致。- 空元素
<a>和<b>对应的Java类可以是空类,Jackson会自动生成空标签。
运行上述代码后,输出的XML结构就会和你需要的一致:
<foo> <bar> <a/> Some text <b/> </bar> </foo>
内容的提问来源于stack exchange,提问作者Paweł Adamski
相关产品推荐
相关产品推荐

