Skip to content

Commit 2936ba5

Browse files
committed
Fix #1322
1 parent 958c824 commit 2936ba5

File tree

4 files changed

+50
-27
lines changed

4 files changed

+50
-27
lines changed

release-notes/VERSION

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ Project: jackson-databind
44
=== Releases ===
55
------------------------------------------------------------------------
66

7+
2.7.7 (not yet released)
8+
9+
#1322: EnumMap keys not using enum's `@JsonProperty` values unlike Enum values
10+
(reported by MichaelChambers@github)
11+
712
2.7.6 (23-Jul-2016)
813

914
#1215: Problem with type specialization for Maps with `@JsonDeserialize(as=subtype)`

src/main/java/com/fasterxml/jackson/databind/ser/std/StdKeySerializers.java

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.fasterxml.jackson.core.*;
88
import com.fasterxml.jackson.databind.*;
99
import com.fasterxml.jackson.databind.ser.impl.PropertySerializerMap;
10+
import com.fasterxml.jackson.databind.util.EnumValues;
1011

1112
@SuppressWarnings("serial")
1213
public class StdKeySerializers
@@ -64,6 +65,7 @@ public static JsonSerializer<Object> getStdKeySerializer(SerializationConfig con
6465
*
6566
* @since 2.7
6667
*/
68+
@SuppressWarnings("unchecked")
6769
public static JsonSerializer<Object> getFallbackKeySerializer(SerializationConfig config,
6870
Class<?> rawKeyType)
6971
{
@@ -78,7 +80,8 @@ public static JsonSerializer<Object> getFallbackKeySerializer(SerializationConfi
7880
return new Dynamic();
7981
}
8082
if (rawKeyType.isEnum()) {
81-
return new Default(Default.TYPE_ENUM, rawKeyType);
83+
return EnumKeySerializer.construct(rawKeyType,
84+
EnumValues.constructFromName(config, (Class<Enum<?>>) rawKeyType));
8285
}
8386
}
8487
return DEFAULT_KEY_SERIALIZER;
@@ -205,4 +208,37 @@ public void serialize(Object value, JsonGenerator g, SerializerProvider provider
205208
g.writeFieldName((String) value);
206209
}
207210
}
211+
212+
/**
213+
* Specialized instance to use for Enum keys, as per [databind#1322]
214+
*
215+
* @since 2.8
216+
*/
217+
public static class EnumKeySerializer extends StdSerializer<Object>
218+
{
219+
protected final EnumValues _values;
220+
221+
protected EnumKeySerializer(Class<?> enumType, EnumValues values) {
222+
super(enumType, false);
223+
_values = values;
224+
}
225+
226+
public static EnumKeySerializer construct(Class<?> enumType,
227+
EnumValues enumValues)
228+
{
229+
return new EnumKeySerializer(enumType, enumValues);
230+
}
231+
232+
@Override
233+
public void serialize(Object value, JsonGenerator g, SerializerProvider serializers)
234+
throws IOException
235+
{
236+
if (serializers.isEnabled(SerializationFeature.WRITE_ENUMS_USING_TO_STRING)) {
237+
g.writeFieldName(value.toString());
238+
return;
239+
}
240+
Enum<?> en = (Enum<?>) value;
241+
g.writeFieldName(_values.serializedValueFor(en));
242+
}
243+
}
208244
}

src/test/java/com/fasterxml/jackson/databind/ser/TestEnumSerialization.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,14 @@ public void testEnumsWithJsonPropertyInSet() throws Exception
432432
assertEquals("[\"aleph\"]",
433433
MAPPER.writeValueAsString(EnumSet.of(EnumWithJsonProperty.A)));
434434
}
435+
436+
// [databind#1322]
437+
public void testEnumsWithJsonPropertyAsKey() throws Exception
438+
{
439+
EnumMap<EnumWithJsonProperty,String> input = new EnumMap<EnumWithJsonProperty,String>(EnumWithJsonProperty.class);
440+
input.put(EnumWithJsonProperty.A, "b");
441+
assertEquals("{\"aleph\":\"b\"}", MAPPER.writeValueAsString(input));
442+
}
435443
}
436444

437445
// [JACKSON-757], non-inner enum

src/test/java/com/fasterxml/jackson/failing/EnumSerialization1322Test.java

Lines changed: 0 additions & 26 deletions
This file was deleted.

0 commit comments

Comments
 (0)