我想反序列化JSON(傑克遜1.9.11和RestTemplate 1.0.1),其中,一個字段可以具有多種類型的含義,例如:反序列化JSON利用多種類型的在一個場
{"responseId":123,"response":"error"}
或
{"responseId":123,"response":{"foo":"bar", ... }}
無論一種或另一種情況下,用特定的類型(字符串OD定製Response類)的一個二傳手工作正常,但是當我把我的實體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]
我在想三種解決方案,但我沒有得到任何人的工作:只使用字符串setter和內部使用ObjectMapper來解讀該字符串
- ,如果它不等於「錯誤」 ,但是當那個JS數組來的時候,它不是字符串,所以沒有使用String setter :(。
- 使用具有自己的JsonDeserializer擴展的多態類型處理(@JsonTypeInfo註釋) - 我仍然試圖理解這一點並實現。
- 創建HttpMessageConverter的列表並放入所有消息轉換器中,我可以使用。但我這一步是不必要的,因爲只有MappingJacksonHttpMessageConverter被使用了,對嗎?
編輯:它是如何工作的,現在
二傳手在實體bean:
@JsonDeserialize(using = ResponseDeserializer.class)
public void setResponse(Object responseObject) {
if(responseObject instanceof Response)
response = (Response) responseObject;
}
Deserialize方法在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;
}
我建議你使用傑克遜解析器服務器端操縱JSON對象 –
我在客戶端工作,服務器不是我的業務:( – shmoula