使用 Jackson ObjectMapper 反序列化或序列化任何类型的对象并处理异常
Deserializing or serializing any type of object using Jackson ObjectMapper and handling exceptions
我目前有这段代码,我正在尝试重构以允许更多可能的 class 类型(使用虚拟代码进行了简化,但要点是相同的):
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
中 return 正确的类型(而不必在我们从调用者那里得到 return 值后强制转换它)?
从示例实现开始:
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
。
我目前有这段代码,我正在尝试重构以允许更多可能的 class 类型(使用虚拟代码进行了简化,但要点是相同的):
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
中 return 正确的类型(而不必在我们从调用者那里得到 return 值后强制转换它)?
从示例实现开始:
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
。