【问题标题】:Deserialize json by class name按类名反序列化 json
【发布时间】: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.classDog.classCar.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


【解决方案1】:

问题源于编译器希望(实际上)为使用它的每个类型 T 制作此方法的不同实例。然而,论据中没有任何值得支持的地方。

如果调用者不知道该类的字符串表示形式(我假设它也已保存在 JSON 中?)之外的预期类,他将如何处理结果这个电话?既然他不知道,他肯定是把它当做简单的Object,在这种情况下,这个方法还不如简单的返回Object。

如果调用者知道类,那么他可以传入一个类作为参数,你不会有任何问题。

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

【讨论】:

    猜你喜欢
    • 2019-12-24
    • 2012-08-05
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多