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
。
有任何想法吗???
使用jgen.writeFieldName(value.getKey());
代替jgen.writeString(value.getKey());
in MyKeySerializer
。如错误消息所示,Jackson希望您在序列化密钥时写一个字段名(而不是直接写文本)。
我尝试这样做,并且得到了预期的输出。希望这可以帮助!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句