Jackson序列化/反序列化java.util.EnumMap错误

时间:2015-04-24 05:33:53

标签: jackson

当我尝试使用Jackson v2.5.0序列化和反序列化java.util.EnumMap时,我收到以下异常:

com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.EnumMap out of FIELD_NAME token
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)
    at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:835)
    at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:831)
    at com.fasterxml.jackson.databind.deser.std.StdDeserializer._deserializeFromEmpty(StdDeserializer.java:838)
    at com.fasterxml.jackson.databind.deser.std.EnumMapDeserializer.deserialize(EnumMapDeserializer.java:128)
    at com.fasterxml.jackson.databind.deser.std.EnumMapDeserializer.deserialize(EnumMapDeserializer.java:17)
    at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedForId(AsPropertyTypeDeserializer.java:124)
    at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:95)
    at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserializeWithType(MapDeserializer.java:364)
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:521)
    at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:101)
    at com.fasterxml.jackson.databind.deser.impl.BeanPropertyMap.findDeserializeAndSet(BeanPropertyMap.java:285)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:248)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:169)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:144)
    at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedForId(AsPropertyTypeDeserializer.java:124)
    at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:95)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeWithType(BeanDeserializerBase.java:957)
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:521)
    at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:101)
    at com.fasterxml.jackson.databind.deser.impl.BeanPropertyMap.findDeserializeAndSet(BeanPropertyMap.java:285)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:335)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeWithObjectId(BeanDeserializerBase.java:1036)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:172)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:144)
    at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedForId(AsPropertyTypeDeserializer.java:124)
    at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:95)
    at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromAny(AsPropertyTypeDeserializer.java:167)
    at com.fasterxml.jackson.databind.deser.std.UntypedObjectDeserializer$Vanilla.deserializeWithType(UntypedObjectDeserializer.java:494)
    at com.fasterxml.jackson.databind.deser.impl.TypeWrappedDeserializer.deserialize(TypeWrappedDeserializer.java:42)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3560)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2679)
    at org.redisson.codec.JsonJacksonCodec.decode(JsonJacksonCodec.java:107)
    ... 47 more

有谁知道如何解决它?我已经查看了Jackson配置选项文档,但没有看到可以解决这个问题的文档。

1 个答案:

答案 0 :(得分:1)

你能更具体地谈谈你的问题,示例代码,你想要做的事情,我只是使用Jackson 2.5.2整理这个示例代码,它运行正常。

public class Test {

public enum STATE{
    NEW, RUNNING, WAITING, FINISHED
}

public static void main(String[] args) throws JsonProcessingException {

    EnumMap<STATE, String>  stateMap = new EnumMap<>(STATE.class);

    stateMap.put(STATE.RUNNING, "Program is running");
    stateMap.put(STATE.WAITING, "Program is waiting");


    ObjectMapper mapper = new ObjectMapper();

    System.out.println(mapper.writeValueAsString(stateMap));

}

}

输出结果为:

{"RUNNING":"Program is running","WAITING":"Program is waiting"}

让我们检查一下有什么不同并乐意提供帮助。

关于反序列化,由于EnumMap要求类类型作为构造函数的一部分,您考虑将其扩展为特定于类型的枚举,例如:

public class MyEnumMap extends EnumMap<Test.STATE, String> {

public MyEnumMap() {
    super(Test.STATE.class);
}

}

然后你可以扩展到反序列化你可以在对象映射器中引用MyEnumMap

EnumMap enumMap = mapper.readValue("{\"RUNNING\":\"Program is running\",\"WAITING\":\"Program is waiting\"}", MyEnumMap.class);
    enumMap.keySet().forEach(System.out::println);

解串器的输出是:

RUNNING WAITING

最佳,

何塞路易斯