Java 按类名反序列化json
如果我只有类的字符串名,通过规范名称调用和对象的json字符串表示,我如何从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
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);
}
}