Skip to content

Commit 7c72020

Browse files
author
John Meyer
committed
Fix #745
1 parent 6c5826c commit 7c72020

File tree

2 files changed

+47
-2
lines changed

2 files changed

+47
-2
lines changed

src/main/java/com/fasterxml/jackson/databind/deser/std/EnumDeserializer.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,12 @@ public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOEx
218218
if (_deser != null) {
219219
value = _deser.deserialize(p, ctxt);
220220
} else {
221-
value = p.getValueAsString();
221+
JsonToken curr = p.getCurrentToken();
222+
if (curr == JsonToken.VALUE_STRING || curr == JsonToken.FIELD_NAME) {
223+
value = p.getText();
224+
} else {
225+
value = p.getValueAsString();
226+
}
222227
}
223228
try {
224229
return _factory.invoke(_valueClass, value);

src/test/java/com/fasterxml/jackson/databind/deser/TestEnumDeserialization.java

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.io.IOException;
44
import java.math.BigDecimal;
5+
import java.util.Collection;
56
import java.util.EnumMap;
67
import java.util.EnumSet;
78
import java.util.Map;
@@ -12,7 +13,9 @@
1213
import com.fasterxml.jackson.core.type.TypeReference;
1314
import com.fasterxml.jackson.databind.*;
1415
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
16+
import com.fasterxml.jackson.databind.deser.std.EnumDeserializer;
1517
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
18+
import com.fasterxml.jackson.databind.introspect.AnnotatedMethod;
1619
import com.fasterxml.jackson.databind.module.SimpleModule;
1720

1821
@SuppressWarnings("serial")
@@ -123,7 +126,34 @@ protected enum TestEnum324
123126
throw new RuntimeException("Foobar!");
124127
}
125128
}
126-
129+
130+
// [Issue#745]
131+
static class DelegatingDeserializers extends Deserializers.Base
132+
{
133+
@Override
134+
public JsonDeserializer<?> findEnumDeserializer(final Class<?> type, final DeserializationConfig config, final BeanDescription beanDesc) throws JsonMappingException {
135+
final Collection<AnnotatedMethod> factoryMethods = beanDesc.getFactoryMethods();
136+
if (factoryMethods != null) {
137+
for (AnnotatedMethod am : factoryMethods) {
138+
final JsonCreator creator = am.getAnnotation(JsonCreator.class);
139+
if (creator != null) {
140+
return EnumDeserializer.deserializerForCreator(config, type, am);
141+
}
142+
}
143+
}
144+
return null;
145+
}
146+
}
147+
148+
// [Issue#745]
149+
static class DelegatingDeserializersModule extends SimpleModule
150+
{
151+
@Override
152+
public void setupModule(final SetupContext context) {
153+
context.addDeserializers(new DelegatingDeserializers());
154+
}
155+
}
156+
127157
/*
128158
/**********************************************************
129159
/* Tests
@@ -424,4 +454,14 @@ public void testIndexAsString() throws Exception
424454
en = MAPPER.readValue(quote("1"), TestEnum.class);
425455
assertSame(TestEnum.values()[1], en);
426456
}
457+
458+
// [Issue#745]
459+
public void testDeserializerForCreatorWithEnumMaps() throws Exception
460+
{
461+
final ObjectMapper mapper = new ObjectMapper();
462+
mapper.registerModule(new DelegatingDeserializersModule());
463+
EnumMap<EnumWithCreator,String> value = mapper.readValue("{\"enumA\":\"value\"}",
464+
new TypeReference<EnumMap<EnumWithCreator,String>>() {});
465+
assertEquals("value", value.get(EnumWithCreator.A));
466+
}
427467
}

0 commit comments

Comments
 (0)