-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Closed
Milestone
Description
Hi,
I've seen many issues related to Enum keys but it looks like using an EnumMap with property inclusion has some issues.
Version 2.8.11
When using As.WRAPPER_ARRAY as the inclusion I am able to deserialize the Map, but using JsonTypeInfo.As.PROPERTY it throws an exception while deserializing. Here is the code to reproduce and the exception:
import java.util.EnumMap;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.TypeResolverBuilder;
public class JacksonIssueTest {
public static class EventTest {
private EnumMap<EnumMapTestEnum, String> enumMapTest;
public EventTest() {
}
public EventTest(EnumMap<EnumMapTestEnum, String> enumMapTest) {
this.enumMapTest = enumMapTest;
}
public EnumMap<EnumMapTestEnum, String> getEnumMapTest() {
return enumMapTest;
}
public void setEnumMapTest(EnumMap<EnumMapTestEnum, String> enumMapTest) {
this.enumMapTest = enumMapTest;
}
}
public enum EnumMapTestEnum {
A, B, C;
}
public static void main(String args[]) throws Exception {
EnumMap<EnumMapTestEnum, String> enumMap = new EnumMap(EnumMapTestEnum.class);
enumMap.put(EnumMapTestEnum.A, "Test");
EventTest eventTest = new EventTest(enumMap);
/*
* Working
*/
ObjectMapper objectMapperAsArrayWrapper = new ObjectMapper();
TypeResolverBuilder<?> mapTyperAsArrayWrapper = new ObjectMapper.DefaultTypeResolverBuilder(ObjectMapper.DefaultTyping.NON_FINAL);
mapTyperAsArrayWrapper.init(JsonTypeInfo.Id.CLASS, null);
mapTyperAsArrayWrapper.inclusion(JsonTypeInfo.As.WRAPPER_ARRAY);
objectMapperAsArrayWrapper.setDefaultTyping(mapTyperAsArrayWrapper);
String jsonAsArrayWrapper = objectMapperAsArrayWrapper.writeValueAsString(eventTest);
objectMapperAsArrayWrapper.readValue(jsonAsArrayWrapper, EventTest.class);
/*
* Throws Exception
*/
ObjectMapper objectMapperAsPropertyType = new ObjectMapper();
TypeResolverBuilder<?> mapTyperAsPropertyType = new ObjectMapper.DefaultTypeResolverBuilder(ObjectMapper.DefaultTyping.NON_FINAL);
mapTyperAsPropertyType.init(JsonTypeInfo.Id.CLASS, null);
mapTyperAsPropertyType.inclusion(JsonTypeInfo.As.PROPERTY);
objectMapperAsPropertyType.setDefaultTyping(mapTyperAsPropertyType);
String jsonAsPropertyType = objectMapperAsPropertyType.writeValueAsString(eventTest);
objectMapperAsPropertyType.readValue(jsonAsPropertyType, EventTest.class);
}
}
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.EnumMap out of FIELD_NAME token at [Source: {"@class":"JacksonIssueTest$EventTest","enumMapTest":{"@class":"java.util.EnumMap","0":"Test"}}; line: 1, column: 135] (through reference chain: JacksonIssueTest$EventTest["enumMapTest"]) at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:270) at com.fasterxml.jackson.databind.DeserializationContext.reportMappingException(DeserializationContext.java:1247) at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1122) at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1075) at com.fasterxml.jackson.databind.deser.std.StdDeserializer._deserializeFromEmpty(StdDeserializer.java:892) at com.fasterxml.jackson.databind.deser.std.EnumMapDeserializer.deserialize(EnumMapDeserializer.java:130) at com.fasterxml.jackson.databind.deser.std.EnumMapDeserializer.deserialize(EnumMapDeserializer.java:17) at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedForId(AsPropertyTypeDeserializer.java:129) at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:97) at com.fasterxml.jackson.databind.deser.std.EnumMapDeserializer.deserializeWithType(EnumMapDeserializer.java:182) at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:502) at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:104) at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:276) at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:178) at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:150) at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedForId(AsPropertyTypeDeserializer.java:129) at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:97) at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeWithType(BeanDeserializerBase.java:1082) at com.fasterxml.jackson.databind.deser.impl.TypeWrappedDeserializer.deserialize(TypeWrappedDeserializer.java:63) at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3814) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2858) at JacksonIssueTest.main(JacksonIssueTest.java:62)
Running into this using the default codec provided by Redisson(redis java client).
Metadata
Metadata
Assignees
Labels
No labels