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

时间:2019-05-24 21:08:56

标签: java generics jackson deserialization jackson-databind

我目前正在尝试重构此代码,以允许更多可能的类类型(用伪代码简化,但要旨相同):

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中返回正确的类型(而不必在从调用者那里获得返回值之后就强制转换)?

1 个答案:

答案 0 :(得分:2)

从示例实现开始:

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