我正在写一个存储管理器。我想从文件到对象阅读。例如:
protected Object read(String key) throws Exception{
Path pathReadFrom = Paths.get(getPath(key));
if (!Files.isReadable(pathReadFrom)){
throw new FileNotFoundException();
}
Object object = JSON_MAPPER.readValue(Files.readAllBytes(pathReadFrom), Object.class);
return object;
}
JSON_MAPPER是杰克逊的ObjectMapper。
public MyClass get(String id) throws Exception {
MyClass myClassObject = (MyClass) storeManager.read(id);
return myClassObject;
}
我得到了下一个例外:
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.pckg.project.dto.MyClass
如何创建通用的 read()方法?也许我应该设置类似read()方法的第二个参数?
答案 0 :(得分:0)
我想到了一些解决方案:
protected <T> T read(String key, Class<T> valueType) throws Exception{
Path pathReadFrom = Paths.get(getPath(key));
T object = JSON_MAPPER.readValue(Files.readAllBytes(pathReadFrom), valueType);
return object;
}
public MyClass get(String id) throws Exception {
MyClass object = storeManager.read(id, MyClass.class);
return object;
}
工作正常。
答案 1 :(得分:0)
是的,您需要指定要使用的正确目标类型:否则Jackson不知道您可能想要获得哪种类 - 您只是告诉它“用JSON创建java.lang.Object
” “,通过使用所谓的”无类型“模式,它很高兴:JSON对象变为java.util.Map
,JSON数组java.util.List
,JSON字符串常规Java字符串等等。
因此,如果您希望将JSON绑定到类MyClass
,则会传递MyClass.class
而不是Object.class
。
答案 2 :(得分:-1)
你如何施放不相关的物体? LinkedHashMap和MyClass以什么方式相关?您需要手动映射它们(或者可以借助于相当于AutoMapper for .NET的东西)