无法从字符串构造java.lang.Class类型的映射键:无法将键解析为类

无法从字符串构造java.lang.Class类型的映射键:无法将键解析为类,java,jackson,json-deserialization,Java,Jackson,Json Deserialization,我在反序列化包含映射的对象时遇到问题,该映射的键为Class: public class TestSerializeMap { public static class TestClass { private Map<Class<? extends Object>, String> map = new HashMap<>(); public TestClass() { } public

我在反序列化包含映射的对象时遇到问题,该映射的键为
Class

public class TestSerializeMap {

    public static class TestClass {
        private Map<Class<? extends Object>, String> map = new HashMap<>();

        public TestClass() {
        }

        public Map<Class<? extends Object>, String> getMap() {
            return map;
        }
    }

    @Test
    public void testPropertyMapWithClassAsKey() throws Exception {
        TestClass testClass = new TestClass();
        testClass.getMap().put(ArrayList.class, "ArrayList");
        testClass.getMap().put(HashMap.class, "HashMap");

        ObjectMapper mapper = new ObjectMapper();

        String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(testClass);
        System.out.println(json);
        mapper.readValue(json, TestClass.class);
    }
}
当我尝试直接序列化映射时:

@Test
public void testMapWithClassAsKey() throws Exception {
    Map<Class<? extends Object>, String> map = new HashMap<>();
    map.put(ArrayList.class, "ArrayList");
    map.put(HashMap.class, "HashMap");

    ObjectMapper mapper = new ObjectMapper();

    String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(map);
    System.out.println(json);
    mapper.readValue(json, Map.class);
}
@测试
public void testMapWithClassAsKey()引发异常{
Map我在上提交了一个发现。来自FasterXML的Tatu对此进行了调查并解决了问题。问题是Map中
Class
键的序列化


它应该在jackson databind 2.5.1版中修复,请查看这篇文章:是的,我在发布之前检查过。我正在使用jackson 2.6.0。仍然不知道如何修复这个问题。好吧,编写自己的类反序列化器;)显然,JSON的“org.codehaus.jackson”实现中有一个(与fasterxml不同)。可以试一试吗?我想我不需要反序列化程序,当map不是类中的属性时(第二次测试),它会正确反序列化。类反序列化程序应该已经是Jackson的一部分。我想我缺少一些配置。是的,刚刚测试过,它不起作用。我现在唯一能给你的建议是(因为我自己没有时间去做)是调试工作场景-尤其是在成功和失败的情况下选择反序列化程序的部分。它应该给你答案,stacktrace是一个很好的开始;)
@Test
public void testMapWithClassAsKey() throws Exception {
    Map<Class<? extends Object>, String> map = new HashMap<>();
    map.put(ArrayList.class, "ArrayList");
    map.put(HashMap.class, "HashMap");

    ObjectMapper mapper = new ObjectMapper();

    String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(map);
    System.out.println(json);
    mapper.readValue(json, Map.class);
}
@Test
public void testMapWithClassAsKey() throws Exception {
    Map<Class<? extends Object>, String> map = new HashMap<>();
    map.put(ArrayList.class, "ArrayList");
    map.put(HashMap.class, "HashMap");

    ObjectMapper mapper = new ObjectMapper();

    String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(map);
    System.out.println(json);
    mapper.readValue(json, new TypeReference<Map<Class<? extends Object>, String>>(){});
}