Đây là một câu hỏi trùng lặp vì các câu hỏi sau hoặc là lộn xộn hoặc họ chưa được giải đáp tại tất cả:Jackson thực sự không thể loại bỏ json thành một loại chung?
deserializing-a-generic-type-with-jackson
jackson-deserialize-into-runtime-specified-class
jackson-deserialize-using-generic-class
jackson-deserialize-generic-class-variable
Tôi hy vọng rằng điều này câu hỏi cuối cùng sẽ tìm thấy một câu trả lời mà làm cho điều này rõ ràng cho tốt.
Có một mô hình:
public class AgentResponse<T> {
private T result;
public AgentResponse(T result) {
this.result = result;
}
public T getResult() {
return result;
}
}
JSON đầu vào:
{"result":{"first-client-id":3,"test-mail-module":3,"third-client-id":3,"second-client-id":3}}
và hai đề nghị cách deserializing kiểu generic:
mapper.readValue(out, new TypeReference<AgentResponse<Map<String, Integer>>>() {});
hoặc
JavaType javaType = mapper.getTypeFactory().constructParametricType(AgentResponse.class, Map.class);
mapper.readValue(out, javaType);
Jackson không bao giờ có thể đối phó với loại T chung, nó tính toán nó là một bản đồ từ JavaType, nhưng nó tìm đối số constructor kiểu đối tượng vì loại xóa và ném một lỗi. Vì vậy, đây là một lỗi Jackson, hoặc tôi đang làm điều gì đó sai? Điều gì khác là đặc điểm kỹ thuật rõ ràng của TypeReference hoặc JavaType cho?
com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class com.fg.mail.smtp.AgentResponse<java.util.Map<java.lang.String,java.lang.Integer>>]: can not instantiate from JSON object (need to add/enable type information?)
at [Source: [email protected]; line: 1, column: 2]
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:984)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:276)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2888)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2064)
Bạn nên đăng câu hỏi đó lên danh sách gửi thư của người dùng jackson – fge
Ngoài ra, bạn có thực sự cố gắng và deserialize _all_ rằng JSON hay chỉ là giá trị thành viên 'kết quả' của JSON? – fge
Tôi đang deserializing đầu vào JSON vào AgentResponse. Tôi không biết làm thế nào và tại sao tôi sẽ deserialize nó một phần. Nó chỉ là một phản ứng với trạng thái và giá trị kết quả, có thể là Object, collection, map, vv. Tôi đã sửa đổi câu hỏi để chỉ có kết quả chung, – lisak