我目前正在尝试重构此代码,以允许更多可能的类类型(用伪代码简化,但要旨相同):
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
中返回正确的类型(而不必在从调用者那里获得返回值之后就强制转换)?
答案 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);
}
}
您可以编写两个常规方法:serialiseToJson
和deserialiseFromJson
,它们可以将任何类型的序列化为JSON
,并将JSON
有效负载反序列化为给定的Class
。当然,您可以为最常见和最常用的类(例如deserialiseToSomeSpecificClass
)实现一些额外的方法。您可以使用以下格式编写任意数量的方法:deserialiseToXYZ
。