Java 使用Jackson ObjectMapper反序列化或序列化任何类型的对象并处理异常
我目前正在尝试重构这段代码,以允许更多可能的类类型(用伪代码简化,但要点相同):Java 使用Jackson ObjectMapper反序列化或序列化任何类型的对象并处理异常,java,generics,jackson,deserialization,jackson-databind,Java,Generics,Jackson,Deserialization,Jackson Databind,我目前正在尝试重构这段代码,以允许更多可能的类类型(用伪代码简化,但要点相同): 我们最近发现,我们可能必须在这里接受其他类型,而不仅仅是SomeSpecificClass。有没有更好的方法可以做到这一点,而不必将所有内容都更改为对象,而不是某个特定类?这样我们就可以在反序列化something中返回正确的类型(并且不必在从调用方获得返回值后强制转换它) 从示例实现开始: class JsonObjectConverter { private ObjectMapper mapper =
我们最近发现,我们可能必须在这里接受其他类型,而不仅仅是
SomeSpecificClass
。有没有更好的方法可以做到这一点,而不必将所有内容都更改为对象
,而不是某个特定类
?这样我们就可以在反序列化something
中返回正确的类型(并且不必在从调用方获得返回值后强制转换它) 从示例实现开始:
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);
}
}
类JSONObject转换器{
私有对象映射器映射器=新对象映射器();
公共字符串serialiseToJson(对象值){
试一试{
返回mapper.writeValueAsString(值);
}捕获(JsonProcessingException e){
抛出新的IllegalArgumentException(“无法序列化:”+value,e);
}
}
public T反序列化fromJSON(字符串json,类clazz){
试一试{
返回mapper.readValue(json,clazz);
}捕获(IOE异常){
抛出新的IllegalArgumentException(“无法反序列化:”+clazz,e);
}
}
公共SomeSpecificClass反序列化SetOsomeSpecificClass(字符串json){
返回deserialiseFromJson(json,SomeSpecificClass.class);
}
}
您可以编写两个通用方法:serialiseToJson
和deserialiseFromJson
,它们可以将任何类型序列化为JSON
,并将JSON
负载反序列化为给定的类。当然,您可以为最常见和最常用的类实现一些额外的方法,如反序列化setosomespecificclass
。您可以按照以下格式编写任意数量的方法:反序列化setoxyz
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);
}
}