【问题标题】:Jackson API - Customize StdKeySerialize to add an attributeJackson API - 自定义 StdKeySerialize 以添加属性
【发布时间】: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


    【解决方案1】:

    很难做到这一点,因为键序列化器实际上只用于输出名称,对于 JSON 来说,名称是要输出的单个标记。对于 XML 输出,它可能是可行的,但在尝试之前很难知道。

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

    【讨论】:

    • StaxMan,感谢您的回复。所以你要求我通过扩展 JsonSerializer 来定制 Serializer 吗?您甚至排除了扩展 MapSerializer 的可能性吗? MapSerializer 似乎是我第二好的选择,我们可以通过 MapSerializer.construct 来构造它。这些方法参数确实让我有点困惑。你能给我一些关于“construct”方法的代码sn-p吗?
    猜你喜欢
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 2023-03-17
    • 1970-01-01
    • 2015-07-12
    • 2015-03-09
    相关资源
    最近更新 更多