...
diff --git a/src/mapper/java/org/codehaus/jackson/map/deser/BasicDeserializerFactory.java b/src/mapper/java/org/codehaus/jackson/map/deser/BasicDeserializerFactory.java index 6c9c6c0..8fdda5d 100644 --- a/src/mapper/java/org/codehaus/jackson/map/deser/BasicDeserializerFactory.java +++ b/src/mapper/java/org/codehaus/jackson/map/deser/BasicDeserializerFactory.java
@@ -393,7 +393,9 @@ if (kt == null || !kt.isEnum()) { throw new IllegalArgumentException("Can not construct EnumMap; generic (key) type not available"); } - return new EnumMapDeserializer(constructEnumResolver(kt, config), contentDeser); + return new EnumMapDeserializer(keyType.getRawClass(), + createEnumDeserializer(config, p, keyType, property), + contentDeser); } // Otherwise, generic handler works ok.
diff --git a/src/mapper/java/org/codehaus/jackson/map/deser/std/EnumDeserializer.java b/src/mapper/java/org/codehaus/jackson/map/deser/std/EnumDeserializer.java index e04d174..9c06f55 100644 --- a/src/mapper/java/org/codehaus/jackson/map/deser/std/EnumDeserializer.java +++ b/src/mapper/java/org/codehaus/jackson/map/deser/std/EnumDeserializer.java
@@ -66,8 +66,8 @@ { JsonToken curr = jp.getCurrentToken(); - // Usually should just get string value: - if (curr == JsonToken.VALUE_STRING) { + // Usually should just get string value; but in some cases FIELD_NAME (enum as key) + if (curr == JsonToken.VALUE_STRING || curr == JsonToken.FIELD_NAME) { String name = jp.getText(); Enum<?> result = _resolver.findEnum(name); if (result == null) { @@ -124,7 +124,7 @@ JsonToken curr = jp.getCurrentToken(); // Usually should just get string value: - if (curr != JsonToken.VALUE_STRING) { + if (curr != JsonToken.VALUE_STRING && curr != JsonToken.FIELD_NAME) { throw ctxt.mappingException(_enumClass); } String value = jp.getText();
diff --git a/src/mapper/java/org/codehaus/jackson/map/deser/std/EnumMapDeserializer.java b/src/mapper/java/org/codehaus/jackson/map/deser/std/EnumMapDeserializer.java index ad4ddcf..1996a63 100644 --- a/src/mapper/java/org/codehaus/jackson/map/deser/std/EnumMapDeserializer.java +++ b/src/mapper/java/org/codehaus/jackson/map/deser/std/EnumMapDeserializer.java
@@ -26,17 +26,27 @@ public class EnumMapDeserializer extends StdDeserializer<EnumMap<?,?>> { - protected final EnumResolver<?> _enumResolver; + protected final Class<?> _enumClass; + + protected final JsonDeserializer<Enum<?>> _keyDeserializer; protected final JsonDeserializer<Object> _valueDeserializer; - public EnumMapDeserializer(EnumResolver<?> enumRes, JsonDeserializer<Object> valueDes) + @Deprecated + public EnumMapDeserializer(EnumResolver<?> enumRes, JsonDeserializer<Object> valueDeser) { - super(EnumMap.class); - _enumResolver = enumRes; - _valueDeserializer = valueDes; + this(enumRes.getEnumClass(), new EnumDeserializer(enumRes), valueDeser); } + public EnumMapDeserializer(Class<?> enumClass, JsonDeserializer<?> keyDeserializer, + JsonDeserializer<Object> valueDeser) + { + super(EnumMap.class); + _enumClass = enumClass; + _keyDeserializer = (JsonDeserializer<Enum<?>>) keyDeserializer; + _valueDeserializer = valueDeser; + } + @Override public EnumMap<?,?> deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException @@ -48,10 +58,9 @@ EnumMap result = constructMap(); while ((jp.nextToken()) != JsonToken.END_OBJECT) { - String fieldName = jp.getCurrentName(); - Enum<?> key = _enumResolver.findEnum(fieldName); + Enum<?> key = _keyDeserializer.deserialize(jp, ctxt); if (key == null) { - throw ctxt.weirdStringException(_enumResolver.getEnumClass(), "value not one of declared Enum instance names"); + throw ctxt.weirdStringException(_enumClass, "value not one of declared Enum instance names"); } // And then the value... JsonToken t = jp.nextToken(); @@ -76,7 +85,6 @@ private EnumMap<?,?> constructMap() { - Class<? extends Enum<?>> enumCls = _enumResolver.getEnumClass(); - return new EnumMap(enumCls); + return new EnumMap(_enumClass); } }