Tôi muốn deserialize JSON (với Jackson 1.9.11 và 1.0.1 RestTemplate), trong đó một lĩnh vực có thể có nhiều ý nghĩa loại, ví dụ:deserializing JSON với nhiều loại trong một lĩnh vực
{"responseId":123,"response":"error"}
hoặc
{"responseId":123,"response":{"foo":"bar", ... }}
hoặc một hoặc trường hợp khác hoạt động chính xác với một setter của loại hình cụ thể (string od lớp Response tùy chỉnh), nhưng khi tôi đưa vào entity bean setter overriden của tôi để có thể xử lý cả hai trường hợp, ngoại lệ được ném :
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]
Tôi đã suy nghĩ về ba giải pháp, nhưng tôi đã không nhận được bất kỳ trong số họ làm việc:
- chỉ sử dụng chuỗi setter và bên sử dụng ObjectMapper để unmarshall chuỗi đó, nếu nó không phải là tương đương với "lỗi" , nhưng khi mà JS Array xuất hiện, nó không phải là chuỗi nên không có setter String được sử dụng: (.
- sử dụng xử lý loại đa hình (chú thích @JsonTypeInfo) với tiện ích mở rộng JsonDeserializer của riêng - Tôi vẫn đang cố gắng hiểu điều này và triển khai.
- tạo danh sách của HttpMessageConverter và đặt bên trong tất cả trình chuyển đổi thư, tôi có thể sử dụng. Nhưng tôi điều bước này là không cần thiết, bởi vì chỉ có MappingJacksonHttpMessageConverter được sử dụng, tôi có phải không?
EDIT: làm thế nào nó hoạt động tại
Setter trong entity bean:
@JsonDeserialize(using = ResponseDeserializer.class)
public void setResponse(Object responseObject) {
if(responseObject instanceof Response)
response = (Response) responseObject;
}
phương pháp Deserialize trong 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;
}
tôi khuyên bạn nên sử dụng phân tích cú pháp Jackson cho phía máy chủ thao tác của các đối tượng JSON –
Tôi đang làm việc trên phía máy khách, máy chủ không phải là doanh nghiệp của tôi: ( – shmoula