使用 Jackson ObjectMapper 反序列化或序列化任何类型的对象并处理异常

Deserializing or serializing any type of object using Jackson ObjectMapper and handling exceptions

我目前有这段代码,我正在尝试重构以允许更多可能的 class 类型(使用虚拟代码进行了简化,但要点是相同的):

private String serializeSomething(final SomeSpecificClass something) {
    try {
        return mapper.writeValueAsString(someething);
    } catch (final IOException e) {
        throw new SomeCustomException("blah", e);
    }
}

private SomeSpecificClass deserializeSomething(final String payload) {
    try {
        return mapper.readValue(payload, SomeSpecificClass.class);
    } catch (final IOException e) {
        // do special things here
        throw new SomeCustomException("blah", e);
    }
}

我们最近发现我们可能不得不在这里接受其他类型,而不仅仅是 SomeSpecificClass。有没有更好的方法可以做到这一点而不必将所有内容都更改为 Object 而不是 SomeSpecificClass?这样我们就可以在 deserializeSomething 中 return 正确的类型(而不必在我们从调用者那里得到 return 值后强制转换它)?

从示例实现开始:

class JsonObjectConverter {

    private ObjectMapper mapper = new ObjectMapper();

    public String serialiseToJson(Object value) {
        try {
            return mapper.writeValueAsString(value);
        } catch (JsonProcessingException e) {
            throw new IllegalArgumentException("Could not serialise: " + value, e);
        }
    }

    public <T> T deserialiseFromJson(String json, Class<T> clazz) {
        try {
            return mapper.readValue(json, clazz);
        } catch (IOException e) {
            throw new IllegalArgumentException("Could not deserialize: " + clazz, e);
        }
    }

    public SomeSpecificClass deserialiseToSomeSpecificClass(String json) {
        return deserialiseFromJson(json, SomeSpecificClass.class);
    }
}

您可以编写两个通用方法:serialiseToJsondeserialiseFromJson,它们可以将任何类型序列化为 JSON 并将 JSON 有效负载反序列化为给定的 Class。当然,您可以为最常见和最常用的 类(例如 deserialiseToSomeSpecificClass)实现一些额外的方法。您可以按照以下格式编写任意数量的方法:deserialiseToXYZ