我想反序列化 JSON(使用 Jackson 1.9.11 和 RestTemplate 1.0.1),其中一个字段可能具有更多类型含义,例如:
{"responseId":123,"response":"error"}
或者
{"responseId":123,"response":{"foo":"bar", ... }}
任何一种情况都可以与特定类型的一个设置器(字符串或自定义响应类)一起正常工作,但是当我放入我的实体 bean 覆盖设置器以能够处理这两种情况时,会引发异常:
Caused by: org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [xxxx.templates.ExportResponse] and content type [application/json;charset=utf-8]
我正在考虑三种解决方案,但我没有让它们中的任何一个起作用:
- 仅使用 String setter 并在内部使用 ObjectMapper 来解组该字符串,如果它不等于“error”,但是当该 JS Array 出现时,它不是字符串,因此不使用 String setter :(。
- 使用带有自己的 JsonDeserializer 扩展的多态类型处理(@JsonTypeInfo 注释) - 我仍在尝试理解并实现这一点。
- 创建 HttpMessageConverter 列表并放入我可以使用的所有消息转换器。但我认为这一步是不必要的,因为只使用了 MappingJacksonHttpMessageConverter,对吗?
编辑:它现在是如何工作的
实体 bean 中的设置器:
@JsonDeserialize(using = ResponseDeserializer.class)
public void setResponse(Object responseObject) {
if(responseObject instanceof Response)
response = (Response) responseObject;
}
ResponseDeserializer 中的反序列化方法:
public Response deserialize(JsonParser parser, DeserializationContext context) throws IOException, JsonProcessingException {
Response response = new Response();
if(JsonToken.START_OBJECT.equals(parser.getCurrentToken())) {
ObjectMapper mapper = new ObjectMapper();
response = mapper.readValue(parser, Response.class);
} else
throw new JsonMappingException("Unexpected token received.");
return response;
}