You need to enable JavaScript to run this app. Jackson如何在JSON转XML时为XML标签添加自定义属性
优惠活动
大模型
产品
解决方案
定价
更多

Jackson如何在JSON转XML时为XML标签添加自定义属性

实现方案

你可以通过Jackson XML模块提供的注解或自定义序列化器两种方式实现需求,具体如下:

方案1:修改POJO加注解(推荐,实现成本最低)

  1. 确认项目已引入jackson-dataformat-xml依赖,Maven配置参考:
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>和你项目中其他Jackson组件版本一致即可</version>
</dependency>
  1. 调整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";
    }
}
  1. 构造对象并序列化,用法和原有逻辑基本一致:
// 构造对象示例
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生成逻辑:

  1. 实现自定义序列化器:
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();
    }
}
  1. 在原有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 00:30:02