Jackson如何在JSON转XML时为XML标签添加自定义属性
实现方案
你可以通过Jackson XML模块提供的注解或自定义序列化器两种方式实现需求,具体如下:
方案1:修改POJO加注解(推荐,实现成本最低)
- 确认项目已引入
jackson-dataformat-xml依赖,Maven配置参考:
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>和你项目中其他Jackson组件版本一致即可</version> </dependency>
- 调整
Person类结构,新增内部类封装name节点的文本和属性:
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlText; import lombok.Data; import lombok.Builder; import com.fasterxml.jackson.annotation.JsonInclude; @Data @Builder @JsonInclude(JsonInclude.Include.NON_NULL) public class Person { private String id; private NameInfo name; @Data public static class NameInfo { // 标注为节点文本内容 @JacksonXmlText private String nameValue; // 标注为当前节点的属性 @JacksonXmlProperty(isAttribute = true) private String type = "student"; } }
- 构造对象并序列化,用法和原有逻辑基本一致:
// 构造对象示例 NameInfo nameInfo = new NameInfo(); nameInfo.setNameValue("abc"); Person person = Person.builder() .id("1") .name(nameInfo) .build(); // 序列化XML XmlMapper xmlMapper = new XmlMapper(); // 格式化输出可选 xmlMapper.enable(SerializationFeature.INDENT_OUTPUT); String xmlResult = xmlMapper.writeValueAsString(person);
输出结果完全符合你的预期,不会生成单独的<type>节点。
方案2:自定义序列化器(适合不能修改原有POJO字段结构的场景)
如果不希望改动原有Person类的字段定义,可以通过自定义序列化器手动控制XML生成逻辑:
- 实现自定义序列化器:
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.std.StdSerializer; import java.io.IOException; public class PersonSerializer extends StdSerializer<Person> { public PersonSerializer() { super(Person.class); } @Override public void serialize(Person person, JsonGenerator gen, SerializerProvider provider) throws IOException { gen.writeStartObject(); gen.writeStringField("id", person.getId()); // 手动构造带属性的name节点 gen.writeObjectFieldStart("name"); gen.writeAttribute("type", person.getType()); gen.writeRaw(person.getName()); gen.writeEndObject(); gen.writeEndObject(); } }
- 在原有
Person类上添加序列化器注解即可,其他逻辑无需改动:
@Data @Builder @JsonInclude(JsonInclude.Include.NON_NULL) @JsonSerialize(using = PersonSerializer.class) public class Person { private String id; private String name; private String type = "student"; }
内容的提问来源于stack exchange,提问作者Abhinav Mehrotra
相关产品推荐
相关产品推荐

