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

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

最佳答案

从示例实现开始:

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

关于java - 使用 Jackson ObjectMapper 反序列化或序列化任何类型的对象并处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56299558/

相关文章:

java - 类型参数 T#1 不在类型变量 T#2 的范围内

java - 将 json 时间戳转换为普通 java 时间戳

java - 使用线程本地避免创建映射以减少 GC 但失败

java - 如何将 url 作为 @PathVariable 传递给 spring RestController?

Java Swing - KeyListener

c# - 通用类型的 Unity 配置

java - 具有非通用实现的通用类型

java - 如何使用 JSON 动态创建 POJO?

java - 为什么我无法使用 Jackson Java 库解包和序列化 Java 映射?

java - 检测 Windows 10 上的 Java VM 架构