Jackson은 EnumMap 키를 직렬화하는 방법을 사용자 정의 할 수 있습니까? 예를 들어, 나는 그 때 잭슨이Jackson EnumMap 키 직렬화
{"map":{"ABC":"foo","DEF":"bar","XYZ":"baz"}}
로 MyObject
를 직렬화합니다
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;
}
}
있습니다.
대신, 나는 그것이
{"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
예외와 함께 실패합니다.
어떤 아이디어 ???
이 접근법은 HashMap의 경우에 효과적입니다. MyKey는 열거 형이고 실제로 EnumMap을 사용하고 있습니다. 불행히도,이 업데이트 된 serializer를 사용하는 경우에도 Jackson은 @JsonValue를 사용하더라도 정의한 getId() 메서드 대신 enum의 이름()을 출력합니다. EnumMap에서 또 다른 접근법을 알고 있습니까? – ManRow
'enum'을 가진 코드에 대한 링크를 게시 할 수 있습니까? 이전 예제에서'MyKey'를'enKey' (getkey 메소드를 그대로 사용)로 변환했고, 직렬화 된 출력은 이전과 동일했습니다. – Jackall
하지만 HashMap 대신에'EnumMap'을 사용하면 어떨까요? – ManRow