Java将Object转换为MyClass

时间:2015-10-11 23:19:41

标签: 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_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()方法的第二个参数?

3 个答案:

答案 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的东西)