使用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
相关产品推荐
相关产品推荐

