Questa è una domanda duplicato perché le seguenti domande sono o disordinato o non si risponde a tutti:Jackson non è davvero in grado di deserializzare JSON in un tipo generico?
deserializing-a-generic-type-with-jackson
jackson-deserialize-into-runtime-specified-class
jackson-deserialize-using-generic-class
jackson-deserialize-generic-class-variable
Spero che questo la domanda troverà finalmente una risposta che lo chiarisca definitivamente.
Avere un modello:
public class AgentResponse<T> {
private T result;
public AgentResponse(T result) {
this.result = result;
}
public T getResult() {
return result;
}
}
ingresso JSON:
mapper.readValue(out, new TypeReference<AgentResponse<Map<String, Integer>>>() {});
o
JavaType javaType = mapper.getTypeFactory().constructParametricType(AgentResponse.class, Map.class);
mapper.readValue(out, javaType);
:
{"result":{"first-client-id":3,"test-mail-module":3,"third-client-id":3,"second-client-id":3}}
e due modi di deserializzazione tipi generici consigliato
Jackson non è mai in grado di gestire il tipo generico T, si tratta di una mappa da JavaType, ma trova argomento di tipo Object constructor a causa della cancellazione di tipo e genera un errore. Quindi questo è un bug di Jackson, o sto facendo qualcosa di sbagliato? Cos'altro sono le specifiche esplicite di TypeReference o JavaType?
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)
Si dovrebbe postare quella domanda sulla mailing list di jackson-users – fge
Inoltre, si tenta veramente di deserializzare _all_ quel JSON o solo il valore membro 'result' di questo JSON? – fge
Sto deserializzando l'input JSON in AgentResponse. Non so come e perché lo avrei deserializzato parzialmente. È solo una risposta con lo stato e il valore del risultato, che può essere Oggetto, raccolta, mappa, ecc. Ho modificato la domanda quindi c'è solo il risultato generico, – lisak