Jackson EnumMap密钥序列化

时间:2013-10-15 02:37:59

标签: java json serialization jackson jsonserializer

Jackson是否允许您自定义EnumMap键的序列化方式?例如,如果我有

public enum MyKey
{
    ABC, DEF, XYZ;

    public String getKey()
    {
        return "my-key-" + ordinal();
    }
}

和一些

public class MyObject
{
    private final Map<MyKey,String> map = new EnumMap<>(MyKey.class);

    public MyObject()
    {
        map.put(MyKey.ABC, "foo");
        map.put(MyKey.DEF, "bar");
        map.put(MyKey.XYZ, "baz");
    }

    public Map<MyKey,String> getMap()
    {
        return map;
    }
}

然后杰克逊会将MyObject序列化为

{"map":{"ABC":"foo","DEF":"bar","XYZ":"baz"}}

相反,我希望它像

一样序列化它

{"map":{"my-key-0":"foo","my-key-1":"bar","my-key-2":"baz"}}。我不想覆盖任何toString()以使其工作。杰克逊根本不可能这样做吗?

我试过这样做:

public class MyKeySerializer extends JsonSerializer<MyKey>
{
    @Override
    public void serialize(MyKey value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException
    {
        jgen.writeString(value.getKey());
    }
}

然后添加

public class MyObject
{
    ...

    @JsonSerialize(keyUsing = MyKeySerializer.class)
    public Map<MyKey,String> getMap()
    {
        return map;
    }

    ...
}

但是因org.codehaus.jackson.JsonGenerationException: Can not write text value, expecting field name例外而失败。

任何想法???

1 个答案:

答案 0 :(得分:4)

jgen.writeFieldName(value.getKey());中使用jgen.writeString(value.getKey());代替MyKeySerializer。正如错误消息所示,Jackson希望您在序列化密钥时编写字段名称(而不是直接写入文本)。

我试过这样做,我得到了预期的输出。希望这有帮助!