Jackson API - 自定义StdDeSerializer添加属性

时间:2013-11-29 09:20:10

标签: xml-serialization jackson jackson-modules

我们有一个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,我猜它会有点太过分了。 寻找您对解决方案的看法。

感谢。

1 个答案:

答案 0 :(得分:0)

要使这项工作变得困难,因为关键序列化器实际上只是为了输出名称,对于JSON来说,输出名称是单个标记。对于XML输出,它可能是可行的,但在尝试之前很难知道。

所以我认为我实际上建议编写一个完整的自定义序列化程序,它可以产生精确的输出,而不必担心键/值序列化器抽象的关注点划分。

相关问题