【发布时间】:2013-11-29 09:20:10
【问题描述】:
我们有一个 HashMap,其值如下。
Map<String, Object> hm = new HashMap<String, Object>();
map.put("type:1234", "value");
通用的 jackson-databind api 会将其序列化为
<type:1234>value</type:1234>
我希望它按照下面的顺序进行序列化。
<type_1234 value="type:1234">value</type_1234>
我尝试扩展 StdKeySerializer 并将自定义序列化程序添加到 XmlMapper,如下所示:
XmlMapper xMapper = new XmlMapper();
SimpleModule sm = new SimpleModule("test-module", new Version(1,0,0,null,"gId","aId"));
sm.addSerializer(new CustomKeySerializer());
xMapper.registerModule(sm);
自定义密钥序列化器如下所示:
public class CustomKeySerializer extends StdKeySerializer {
@Override
public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider)
throws IOException, JsonGenerationException
{
if (value instanceof Date) {
provider.defaultSerializeDateKey((Date) value, jgen);
} else {
jgen.writeFieldName(value.toString().replace(':', '_'));
// TODO: Add the "value" attribute.
final ToXmlGenerator xgen = (ToXmlGenerator) jgen;
xgen.setNextIsAttribute(true);
xgen.setNextName(new QName("value"));
xgen.writeString(value.toString());
}
}
}
上面代码中的“TODO”是我花了很多时间但还没有成功的地方。
解决上述问题的下一个方法是编写一个自定义 MapSerializer,我想这有点太远了。 寻找您对解决方案的想法。
谢谢。
【问题讨论】:
标签: xml-serialization jackson jackson-modules