Skip to content

Commit 6adce38

Browse files
committed
Merge branch '2.7'
2 parents 20a1b7c + 2936ba5 commit 6adce38

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
@@ -71,6 +71,11 @@ Project: jackson-databind
7171
#1277: Add caching of resolved generic types for `TypeFactory`
7272
(requested by Andriy P)
7373

74+
2.7.7 (not yet released)
75+
76+
#1322: EnumMap keys not using enum's `@JsonProperty` values unlike Enum values
77+
(reported by MichaelChambers@github)
78+
7479
2.7.6 (23-Jul-2016)
7580

7681
#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
@@ -8,6 +8,7 @@
88
import com.fasterxml.jackson.databind.*;
99
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper;
1010
import com.fasterxml.jackson.databind.ser.impl.PropertySerializerMap;
11+
import com.fasterxml.jackson.databind.util.EnumValues;
1112

1213
@SuppressWarnings("serial")
1314
public class StdKeySerializers
@@ -71,6 +72,7 @@ public static JsonSerializer<Object> getStdKeySerializer(SerializationConfig con
7172
*
7273
* @since 2.7
7374
*/
75+
@SuppressWarnings("unchecked")
7476
public static JsonSerializer<Object> getFallbackKeySerializer(SerializationConfig config,
7577
Class<?> rawKeyType)
7678
{
@@ -85,7 +87,8 @@ public static JsonSerializer<Object> getFallbackKeySerializer(SerializationConfi
8587
return new Dynamic();
8688
}
8789
if (rawKeyType.isEnum()) {
88-
return new Default(Default.TYPE_ENUM, rawKeyType);
90+
return EnumKeySerializer.construct(rawKeyType,
91+
EnumValues.constructFromName(config, (Class<Enum<?>>) rawKeyType));
8992
}
9093
}
9194
return DEFAULT_KEY_SERIALIZER;
@@ -217,4 +220,37 @@ public void serialize(Object value, JsonGenerator g, SerializerProvider provider
217220
g.writeFieldName((String) value);
218221
}
219222
}
223+
224+
/**
225+
* Specialized instance to use for Enum keys, as per [databind#1322]
226+
*
227+
* @since 2.8
228+
*/
229+
public static class EnumKeySerializer extends StdSerializer<Object>
230+
{
231+
protected final EnumValues _values;
232+
233+
protected EnumKeySerializer(Class<?> enumType, EnumValues values) {
234+
super(enumType, false);
235+
_values = values;
236+
}
237+
238+
public static EnumKeySerializer construct(Class<?> enumType,
239+
EnumValues enumValues)
240+
{
241+
return new EnumKeySerializer(enumType, enumValues);
242+
}
243+
244+
@Override
245+
public void serialize(Object value, JsonGenerator g, SerializerProvider serializers)
246+
throws IOException
247+
{
248+
if (serializers.isEnabled(SerializationFeature.WRITE_ENUMS_USING_TO_STRING)) {
249+
g.writeFieldName(value.toString());
250+
return;
251+
}
252+
Enum<?> en = (Enum<?>) value;
253+
g.writeFieldName(_values.serializedValueFor(en));
254+
}
255+
}
220256
}

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)