我目前正在尝试重构此代码,以便允许更多可能的类类型(用虚拟代码简化,但要点是相同的):
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);
}
}
您可以编写两个通用方法:serialiseToJson
和deserialiseFromJson
,它们可以将任何类型序列化为JSON
并反序列化JSON
给定Class
的有效负载。当然,您可以为最常见和最常用的类实现一些额外的方法,例如 deserialiseToSomeSpecificClass 。您可以按照以下格式编写任意多个方法:deserialiseToXYZ
。
关于java - 使用 Jackson ObjectMapper 反序列化或序列化任何类型的对象并处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56299558/