diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/std/EnumMapSerializer.java b/src/main/java/com/fasterxml/jackson/databind/ser/std/EnumMapSerializer.java index 84a5b4fd95..5bbebd850f 100644 --- a/src/main/java/com/fasterxml/jackson/databind/ser/std/EnumMapSerializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/ser/std/EnumMapSerializer.java @@ -211,6 +211,7 @@ protected void serializeContents(EnumMap,?> value, JsonGenerat Class prevClass = null; EnumValues keyEnums = _keyEnums; final boolean skipNulls = !provider.isEnabled(SerializationFeature.WRITE_NULL_MAP_VALUES); + final boolean useToString = provider.isEnabled(SerializationFeature.WRITE_ENUMS_USING_TO_STRING); final TypeSerializer vts = _valueTypeSerializer; for (Map.Entry,?> entry : value.entrySet()) { @@ -219,18 +220,22 @@ protected void serializeContents(EnumMap,?> value, JsonGenerat continue; } // First, serialize key - Enum key = entry.getKey(); - if (keyEnums == null) { - /* 15-Oct-2009, tatu: This is clumsy, but still the simplest efficient - * way to do it currently, as Serializers get cached. (it does assume we'll always use - * default serializer tho -- so ideally code should be rewritten) - */ - // ... and lovely two-step casting process too... - StdSerializer ser = (StdSerializer) provider.findValueSerializer( - key.getDeclaringClass(), _property); - keyEnums = ((EnumSerializer) ser).getEnumValues(); + final Enum key = entry.getKey(); + if (useToString) { + jgen.writeFieldName(key.toString()); + } else { + if (keyEnums == null) { + /* 15-Oct-2009, tatu: This is clumsy, but still the simplest efficient + * way to do it currently, as Serializers get cached. (it does assume we'll always use + * default serializer tho -- so ideally code should be rewritten) + */ + // ... and lovely two-step casting process too... + StdSerializer ser = (StdSerializer) provider.findValueSerializer( + key.getDeclaringClass(), _property); + keyEnums = ((EnumSerializer) ser).getEnumValues(); + } + jgen.writeFieldName(keyEnums.serializedValueFor(key)); } - jgen.writeFieldName(keyEnums.serializedValueFor(key)); if (valueElem == null) { provider.defaultSerializeNull(jgen); continue; @@ -263,6 +268,7 @@ protected void serializeContentsUsing(EnumMap,?> value, JsonGe { EnumValues keyEnums = _keyEnums; final boolean skipNulls = !provider.isEnabled(SerializationFeature.WRITE_NULL_MAP_VALUES); + final boolean useToString = provider.isEnabled(SerializationFeature.WRITE_ENUMS_USING_TO_STRING); final TypeSerializer vts = _valueTypeSerializer; for (Map.Entry,?> entry : value.entrySet()) { @@ -271,13 +277,17 @@ protected void serializeContentsUsing(EnumMap,?> value, JsonGe continue; } Enum key = entry.getKey(); - if (keyEnums == null) { - // clumsy, but has to do for now: - StdSerializer ser = (StdSerializer) provider.findValueSerializer(key.getDeclaringClass(), - _property); - keyEnums = ((EnumSerializer) ser).getEnumValues(); + if (useToString) { + jgen.writeFieldName(key.toString()); + } else { + if (keyEnums == null) { + // clumsy, but has to do for now: + StdSerializer ser = (StdSerializer) provider.findValueSerializer(key.getDeclaringClass(), + _property); + keyEnums = ((EnumSerializer) ser).getEnumValues(); + } + jgen.writeFieldName(keyEnums.serializedValueFor(key)); } - jgen.writeFieldName(keyEnums.serializedValueFor(key)); if (valueElem == null) { provider.defaultSerializeNull(jgen); continue; diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/std/EnumSerializer.java b/src/main/java/com/fasterxml/jackson/databind/ser/std/EnumSerializer.java index 5805eb66ab..bf4c68df1b 100644 --- a/src/main/java/com/fasterxml/jackson/databind/ser/std/EnumSerializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/ser/std/EnumSerializer.java @@ -65,7 +65,7 @@ public EnumSerializer(EnumValues v) { public EnumSerializer(EnumValues v, Boolean serializeAsIndex) { - super(Enum.class, false); + super(v.getEnumClass(), false); _values = v; _serializeAsIndex = serializeAsIndex; } diff --git a/src/test/java/com/fasterxml/jackson/databind/ser/TestEnumSerialization.java b/src/test/java/com/fasterxml/jackson/databind/ser/TestEnumSerialization.java index fd4cf223f2..3e6a98d034 100644 --- a/src/test/java/com/fasterxml/jackson/databind/ser/TestEnumSerialization.java +++ b/src/test/java/com/fasterxml/jackson/databind/ser/TestEnumSerialization.java @@ -376,31 +376,6 @@ public void testCustomEnumMapKeySerializer() throws Exception { String json = mapper.writeValueAsString(new MyBean661("abc")); assertEquals(aposToQuotes("{'X-FOO':'abc'}"), json); } - - // [databind#749] - - public void testEnumMapSerDefault() throws Exception { - final ObjectMapper mapper = new ObjectMapper(); - EnumMap m = new EnumMap(LowerCaseEnum.class); - m.put(LowerCaseEnum.A, "value"); - assertEquals("{\"A\":\"value\"}", mapper.writeValueAsString(m)); - } - - public void testEnumMapSerDisableToString() throws Exception { - final ObjectMapper mapper = new ObjectMapper(); - ObjectWriter w = mapper.writer().without(SerializationFeature.WRITE_ENUMS_USING_TO_STRING); - EnumMap m = new EnumMap(LowerCaseEnum.class); - m.put(LowerCaseEnum.A, "value"); - assertEquals("{\"A\":\"value\"}", w.writeValueAsString(m)); - } - - public void testEnumMapSerEnableToString() throws Exception { - final ObjectMapper mapper = new ObjectMapper(); - ObjectWriter w = mapper.writer().with(SerializationFeature.WRITE_ENUMS_USING_TO_STRING); - EnumMap m = new EnumMap(LowerCaseEnum.class); - m.put(LowerCaseEnum.A, "value"); - assertEquals("{\"a\":\"value\"}", w.writeValueAsString(m)); - } } // [JACKSON-757], non-inner enum diff --git a/src/test/java/com/fasterxml/jackson/failing/EnumMap749Test.java b/src/test/java/com/fasterxml/jackson/failing/EnumMap749Test.java new file mode 100644 index 0000000000..4f88e58ce1 --- /dev/null +++ b/src/test/java/com/fasterxml/jackson/failing/EnumMap749Test.java @@ -0,0 +1,51 @@ +package com.fasterxml.jackson.failing; + +import java.util.*; + +import com.fasterxml.jackson.databind.*; + +/** + * Failing tests for [databind#749]: problems using (or not) of `toString()` for Enum keys + * of EnumMap, EnumSet. + */ +public class EnumMap749Test + extends BaseMapTest +{ + protected static enum LC749Enum { + A, B, C; + private LC749Enum() { } + @Override + public String toString() { return name().toLowerCase(); } + } + + /* + /********************************************************** + /* Tests + /********************************************************** + */ + + // [databind#749] + + public void testEnumMapSerDefault() throws Exception { + final ObjectMapper mapper = new ObjectMapper(); + EnumMap m = new EnumMap(LC749Enum.class); + m.put(LC749Enum.A, "value"); + assertEquals("{\"A\":\"value\"}", mapper.writeValueAsString(m)); + } + + public void testEnumMapSerDisableToString() throws Exception { + final ObjectMapper mapper = new ObjectMapper(); + ObjectWriter w = mapper.writer().without(SerializationFeature.WRITE_ENUMS_USING_TO_STRING); + EnumMap m = new EnumMap(LC749Enum.class); + m.put(LC749Enum.A, "value"); + assertEquals("{\"A\":\"value\"}", w.writeValueAsString(m)); + } + + public void testEnumMapSerEnableToString() throws Exception { + final ObjectMapper mapper = new ObjectMapper(); + ObjectWriter w = mapper.writer().with(SerializationFeature.WRITE_ENUMS_USING_TO_STRING); + EnumMap m = new EnumMap(LC749Enum.class); + m.put(LC749Enum.A, "value"); + assertEquals("{\"a\":\"value\"}", w.writeValueAsString(m)); + } +}