...
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);
}
}