Jackson e riferimento al tipo generico

Voglio usare la libreria jackson json per un metodo generico come segue:

public MyRequest tester(){ TypeReference<MyWrapper> typeRef = new TypeReference<MyWrapper>(); MyWrapper requestWrapper = (MyWrapper) JsonConverter.fromJson(jsonRequest, typeRef); return requestWrapper.getRequest(); } 
 public class MyWrapper { private MyRequest request; public MyRequest getRequest() { return request; } public void setRequest(MyRequest request) { this.request = request; } } public class MyRequest{ private List myobjects; public void setMyObjects(List ets) { this.myobjects = ets; } @NotNull @JsonIgnore public T getMyObject() { return myobjects.get(0); } } 

Ora il problema è che quando chiamo getMyObject () che si trova all’interno dell’object request, jackson restituisce l’object personalizzato nidificato come LinkedHashMap. Esiste un modo in cui specifichi che l’object T deve essere restituito ?. Ad esempio: se ho inviato un object di tipo Cliente, il Cliente deve essere restituito da tale Lista ?.

Grazie.

Questo è un problema ben noto con la cancellazione del tipo Java: T è solo una variabile di tipo, e tu devi indicare la class effettiva, di solito come argomento di class. Senza tali informazioni, il meglio che si può fare è usare i limiti; e T semplice è approssimativamente uguale a “T extends Object”. E Jackson legherà quindi oggetti JSON come mappe.

In questo caso, il metodo tester deve avere accesso a Class ed è ansible costruirlo

 JavaType type = mapper.getTypeFactory(). constructCollectionType(List.class, Foo.class) 

e poi

 List list = mapper.readValue(new File("input.json"), type); 

‘JavaType’ funziona !! Stavo cercando di annullare l’operazione (deserializzare) una lista in json String per oggetti java ArrayList e stavo lottando per trovare una soluzione da giorni.
Di seguito è riportato il codice che finalmente mi ha dato una soluzione. Codice:

 JsonMarshallerUnmarshaller { T targetClass; public ArrayList unmarshal(String jsonString) { ObjectMapper mapper = new ObjectMapper(); AnnotationIntrospector introspector = new JacksonAnnotationIntrospector(); mapper.getDeserializationConfig() .withAnnotationIntrospector(introspector); mapper.getSerializationConfig() .withAnnotationIntrospector(introspector); JavaType type = mapper.getTypeFactory(). constructCollectionType( ArrayList.class, targetclass.getClass()); try { Class c1 = this.targetclass.getClass(); Class c2 = this.targetclass1.getClass(); ArrayList temp = (ArrayList) mapper.readValue(jsonString, type); return temp ; } catch (JsonParseException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null ; } }