我们有一个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());
}
}
}
&#34; TODO&#34;在上面的代码中我花了很多时间而没有成功。
解决上述问题的下一个方法是编写一个自定义的MapSerializer,我猜它会有点太过分了。 寻找您对解决方案的看法。
感谢。
答案 0 :(得分:0)
要使这项工作变得困难,因为关键序列化器实际上只是为了输出名称,对于JSON来说,输出名称是单个标记。对于XML输出,它可能是可行的,但在尝试之前很难知道。
所以我认为我实际上建议编写一个完整的自定义序列化程序,它可以产生精确的输出,而不必担心键/值序列化器抽象的关注点划分。