You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用jackson-dataformat-xml为HashMap序列化生成的空XML标签添加属性

问题解答

该需求可以通过jackson-dataformat-xml实现,核心思路是自定义Null值的序列化逻辑,在序列化null值时主动给对应标签添加指定属性。

实现步骤

  • 第一步:自定义Null值序列化器,继承JsonSerializer,重写序列化方法,使用XML生成器在输出空标签的同时插入自定义属性
  • 第二步:将自定义序列化器注册到XmlMapper的序列化配置中,替换默认的Null值序列化逻辑

完整示例代码

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator;
import java.io.IOException;
import java.util.HashMap;

// 自定义Null值序列化器
class NullWithAttributeSerializer extends JsonSerializer<Object> {
    @Override
    public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        ToXmlGenerator xmlGen = (ToXmlGenerator) gen;
        // 写入自定义属性
        xmlGen.writeAttribute("attribute", "something");
        // 输出空标签
        gen.writeNull();
    }
}

public class XmlNullTest {
    public static void main(String[] args) throws Exception {
        XmlMapper mapper = XmlMapper.builder()
                // 注册自定义Null序列化器
                .serializerProvider(serializerProvider ->
                    serializerProvider.setNullValueSerializer(new NullWithAttributeSerializer())
                )
                .build();

        HashMap<String, Object> h1 = new HashMap<>();
        h1.put("test", null);
        System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(h1));
    }
}

输出结果

<HashMap>
  <test attribute="something"/>
</HashMap>

扩展说明

  • 如果需要给不同key的空标签设置不同的属性值,可以进一步自定义Map类型的序列化器,在遍历Map键值对时根据key动态设置属性内容
  • 该配置仅针对Null值生效,非Null值的序列化逻辑不受影响

内容的提问来源于stack exchange,提问作者josephjoguts

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:15:10