【发布时间】:2018-08-20 15:47:12
【问题描述】:
如果我只有类的字符串名称、规范名称调用和对象的 json 字符串表示,我如何从 json 字符串反序列化我的对象?
换句话说,我需要这样的方法:
public <T> T deserialize(String json, String className) {
// some code
}
我们有类名和 json 字符串 - 我们需要将 json 反序列化为 java 对象。
如果我知道对象的类,我知道如何将json反序列化为对象,例如,我们可以使用Jackson:
String json = "{ \"color\" : \"Black\", \"type\" : \"BMW\" }";
Car car = objectMapper.readValue(json, Car.class);
但是在我的任务中有一个不同的类——它可能是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);
}
}
它适用于上面的汽车示例,但带有警告cast exception。
但也许有更好的方法?
哦,并不是所有的对象都这么简单。其中一些会封装集合和其他对象。
【问题讨论】:
-
您能否展示一个导致异常的对
fromJson的调用示例?还请包括类转换异常的堆栈跟踪。 -
如果您不知道在编译时需要使用的类,那么在方法上使用泛型没有多大意义。我只会返回 Object 或将
Class.forName()移动到调用者.. -
@ernest_k,没有任何例外 - Inteliji Idea 中只有警告和突出显示。
标签: java json serialization deserialization