Java将对象转换为MyClass

Java将对象转换为MyClass,java,generics,casting,jackson,Java,Generics,Casting,Jackson,我在写一个存储管理器。我想从一个文件读到另一个对象。例如: protected Object read(String key) throws Exception{ Path pathReadFrom = Paths.get(getPath(key)); if (!Files.isReadable(pathReadFrom)){ throw new FileNotFoundException(); } Object object = JSON_M

我在写一个存储管理器。我想从一个文件读到另一个对象。例如:

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_映射器是Jackson的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

如何创建universalread()方法?也许我应该设置一个类型,比如read()方法的第二个参数?

如何强制转换不相关的对象?LinkedHashMap和MyClass之间有什么联系?您需要手动映射它们(或者可以借助于类似于AutoMapper for.NET的工具)

如何强制转换不相关的对象?LinkedHashMap和MyClass之间有什么联系?您需要手动映射它们(或者可以借助AutoMapper for.NET的等效工具)

我想出了一些解决方案:

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;
}
protected T read(字符串键,类值类型)引发异常{
Path pathReadFrom=Path.get(getPath(key));
T object=JSON_MAPPER.readValue(Files.readAllBytes(pathReadFrom),valueType);
返回对象;
}
公共MyClass get(字符串id)引发异常{
MyClass对象=storeManager.read(id,MyClass.class);
返回对象;
}

它很好用

我想出了一些解决办法:

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;
}
protected T read(字符串键,类值类型)引发异常{
Path pathReadFrom=Path.get(getPath(key));
T object=JSON_MAPPER.readValue(Files.readAllBytes(pathReadFrom),valueType);
返回对象;
}
公共MyClass get(字符串id)引发异常{
MyClass对象=storeManager.read(id,MyClass.class);
返回对象;
}

它很好用

是的,您确实需要指定适当的目标类型来使用:否则Jackson不知道您可能想要得到什么样的类——您只是告诉它“用JSON创建一个
java.lang.Object
”,它很乐意使用所谓的“非类型化”模式:JSON对象变成
java.util.Map
s,JSON数组
java.util.List
s、JSON字符串和常规java字符串等


因此,如果您想将JSON绑定到Class
MyClass
,您将传递
MyClass.Class
,而不是
Object.Class

是的,您确实需要指定适当的目标类型来使用:否则Jackson不知道您可能想要得到什么样的类——您只是告诉它“用JSON创建一个
java.lang.Object
”,它很乐意使用所谓的“非类型化”模式:JSON对象变成
java.util.Map
s、JSON数组
java.util.List
s、JSON字符串和常规java字符串等等


因此,如果您希望将JSON绑定到类
MyClass
,您将传递
MyClass.Class
,而不是
Object.Class

创建此存储管理器的原因是什么?您实际上并没有解释代码是如何将对象写入文件的。如果您的写入方式与读取方式不一致(从异常情况来看似乎是这样)它永远不会工作。请添加write()的代码方法我编写了一个没有DB的web应用程序,所以我在硬盘上以json格式存储数据。这就是为什么我需要一个storeManager。它显然不起作用,因为您将对象作为非结构化映射而不是预期的类型。使用Jackson 2和适当的泛型
readValue
方法可能会解决(即时)问题问题。正如您所见,Jackson将JSON内容读入一个
LinkedHashMap
,以获得有序的键值对。如何将其转换为一个与
LinkedHashMap
完全无关的类型?如果您想要一个“通用阅读器”(听起来像是重新发明的东西,Jackson已经可以做到了),然后创建一个方法,该方法可以从映射中获取项以初始化其字段。您创建此存储管理器的原因是什么?您实际上并没有解释代码是如何将对象写入文件的。如果您的写入方式与读取方式不一致(从异常情况看也是如此)它永远不会工作。请添加write()的代码方法我编写了一个没有DB的web应用程序,所以我在硬盘上以json格式存储数据。这就是为什么我需要一个storeManager。它显然不起作用,因为您将对象作为非结构化映射而不是预期的类型。使用Jackson 2和适当的泛型
readValue
方法可能会解决(即时)问题问题。正如您所见,Jackson将JSON内容读入一个
LinkedHashMap
,以获得有序的键值对。如何将其转换为一个与
LinkedHashMap
完全无关的类型?如果您想要一个“通用阅读器”(听起来像是重新发明的东西,Jackson已经可以做到了),然后创建一个方法,该方法可以从映射中获取项以初始化其字段。我不想返回LinkedHashMap:),我想以某种方式将类型转换为。我明白了。可能是:MyClass object=JSON\u MAPPER.readValue(Files.readAllBytes(pathReadFrom),MyClass.class);Man:)太简单了。我需要返回任何类的方法。它必须看起来像-read(字符串键,AnyClass类);JSON_MAPPER.readValue(Files.readAllBytes(pathReadFrom),class);我不想返回LinkedHashMap:)我想以某种方式将类型转换为。我明白了。可能是:MyClass object=JSON_MAPPER.readValue(Files.readAllBytes(pathReadFrom),MyClass.class);Man:)太简单了。我需要返回任何类的方法。它必须看起来像-read(字符串键,AnyClass类);JSON_MAPPER.readValue(Files.readAllBytes(pathReadFrom),class);
isReadable()
测试是多余的。
isReadable()
测试是多余的。