Java 按类名反序列化json

Java 按类名反序列化json,java,json,serialization,deserialization,Java,Json,Serialization,Deserialization,如果我只有类的字符串名,通过规范名称调用和对象的json字符串表示,我如何从json字符串反序列化我的对象 换句话说,我需要这样的方法: public <T> T deserialize(String json, String className) { // some code } 但是在我的任务中有一个不同的类-它可能是Cat.class,Dog.class,Car.class等等,每个类都有不同的状态。我需要反序列化的通用方法 我写了这样的东西: public final c

如果我只有类的字符串名,通过规范名称调用和对象的json字符串表示,我如何从json字符串反序列化我的对象

换句话说,我需要这样的方法:

public <T> T deserialize(String json, String className) {
 // some code
}
但是在我的任务中有一个不同的类-它可能是
Cat.class
Dog.class
Car.class
等等,每个类都有不同的状态。我需要反序列化的通用方法

我写了这样的东西:

public final class Utils implements Serializable {
    private Utils () {
        throw new AssertionError();
    }

    private static ObjectMapper objectMapper = new ObjectMapper();

    public static String toJson(Object obj) {
        String objectToJson;
        try {
            objectToJson = objectMapper.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            throw new UncheckedIOException(String.format("Can't serialize object %s to JSON string", obj), e);
        }

        return objectToJson;
    }

    public static <T> T fromJson(String json, String className) throws ClassNotFoundException, IOException {
        Class<?> clz = Class.forName(className);
        return (T) objectMapper.readValue(json, clz);
    }
}
public final类Utils实现可序列化{
私人公用事业(){
抛出新的断言错误();
}
私有静态ObjectMapper ObjectMapper=新ObjectMapper();
公共静态字符串toJson(对象obj){
字符串objectToJson;
试一试{
objectToJson=objectMapper.writeValueAsString(obj);
}捕获(JsonProcessingException e){
抛出新的未选中异常(String.format(“无法将对象%s序列化为JSON字符串”,obj),e);
}
返回objectToJson;
}
公共静态T fromJson(字符串json,字符串className)抛出ClassNotFoundException,IOException{
Class clz=Class.forName(className);
返回(T)objectMapper.readValue(json,clz);
}
}
它适用于上面的car示例,但有一个警告
强制转换异常
。 但也许有更好的办法


哦,并不是所有的物体都这么简单。其中一些方法会封装集合和其他对象。

问题源于编译器希望(实际上)为每个使用该方法的类型T创建不同的方法实例。然而,这些论点中没有什么值得怀疑的

如果调用方除了该类的字符串表示(我假设它也保存在JSON中?)之外,不知道应该使用哪个类,那么他将如何处理该调用的结果?因为他不知道,所以他必须将其作为简单对象使用,在这种情况下,该方法也可以简单地返回对象

如果调用者确实知道这个类,那么他可以传入一个类作为参数,这样您就不会有任何问题


在写这篇文章时,我突然想到,ObectMapper的某些readValue方法肯定存在类似的问题,例如接受ResolvedType而不是Class的方法。我注意到,在该类的源代码中,它在类之前包含
/unchecked/
。我“我不确定这是否能解决这个问题,但这是有意义的。

您能给出一个导致异常的示例调用
fromJson
?还请包括类强制转换异常的堆栈跟踪。如果您不知道编译时需要使用的类,那么在该方法上使用泛型没有多大意义。我只需返回Object或将
类.forName()
移动到调用方即可。@ernest_k,没有任何例外-Inteliji Idea中只有警告和高亮显示。
public final class Utils implements Serializable {
    private Utils () {
        throw new AssertionError();
    }

    private static ObjectMapper objectMapper = new ObjectMapper();

    public static String toJson(Object obj) {
        String objectToJson;
        try {
            objectToJson = objectMapper.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            throw new UncheckedIOException(String.format("Can't serialize object %s to JSON string", obj), e);
        }

        return objectToJson;
    }

    public static <T> T fromJson(String json, String className) throws ClassNotFoundException, IOException {
        Class<?> clz = Class.forName(className);
        return (T) objectMapper.readValue(json, clz);
    }
}