java - Jackson EnumMap key 序列化

标签 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;
    }
}

然后 Jackson 会将 MyObject 序列化为

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

相反,我希望它像这样序列化

{"map":{"my-key-0":"foo","my-key-1":"bar","my-key-2":"baz"}}。我不想覆盖任何 toString() 来让它工作。这在 jackson 有可能吗?

我试过这样做:

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 异常。

有什么想法吗???

最佳答案

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

我尝试这样做,并且得到了预期的输出。希望这对您有所帮助!

关于java - Jackson EnumMap key 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19372415/

相关文章:

javascript - 如何将键和零浮点值附加到对象数组中的对象? - JavaScript

c# - 如何反序列化数组

binary - 如何分析二进制文件?

java - 如何将Groovy类的实例分配给Java类中的变量

java - 元素位置中的 Xpath 问题

ios - EXC_BAD_ACCESS 尝试编码 Codable-conformant 类的子类时

android - 如何解析谷歌地点 json

c++ - C++ 中的简单序列化示例

java - 如何在Android应用程序中存储用户定义的类对象以供将来使用和操作?

java - 这是一个什么样的Java成员变量?