杰克逊(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
异常。
有任何想法吗???
MyKey
是一个枚举类型,并且我实际上正在使用EnumMap。不幸的是,即使使用@JsonValue,即使使用了更新的序列化程序,Jackson仍然输出枚举的name()而不是使用我定义的getId()方法。您知道其他可能适用于EnumMap的方法吗? - ManRowEnumMap
而不是 HashMap 呢? 我已经更新了原始帖子中的代码以反映这一点。 - ManRowEnumMap
会使用专门的序列化器进行序列化,因此在序列化键时不会选择您的自定义序列化器。我尝试重写MyKey
中的toString()
实现并使用设置SerializationFeature.WRITE_ENUMS_USING_TO_STRING
,但即使如此也似乎不起作用。因此,我不确定是否有可能实现。 - Jackall