Java 将对象转换为 MyClass

Java cast Object to MyClass

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

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 是 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

如何创建通用的 read() 方法?也许我应该设置一个类似于 read() 方法的第二个参数的类型?

如何投射不相关的物体? 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;
}

它工作正常。

是的,您确实需要指定要使用的正确目标类型:否则 Jackson 不知道您可能想要得到哪种 class -- 您只是告诉它 "create a java.lang.Object out of JSON" ,它通过使用所谓的 "untyped" 模式愉快地做到了:JSON 对象变成 java.util.Maps,JSON 数组 java.util.Lists,JSON 字符串常规 Java 字符串等。

所以如果你想让 JSON 绑定到 Class MyClass,你将传递 MyClass.class 而不是 Object.class