无法从字符串构造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>>(){});
}