Quero usar a biblioteca json jackson para um método genérico da seguinte maneira:
public MyRequest<T> tester() {
TypeReference<MyWrapper<T>> typeRef = new TypeReference<MyWrapper<T>>();
MyWrapper<T> requestWrapper = (MyWrapper<T>) JsonConverter.fromJson(jsonRequest, typeRef);
return requestWrapper.getRequest();
}
...
public class MyWrapper<T> {
private MyRequest<T> request;
public MyRequest<T> getRequest() {
return request;
}
public void setRequest(MyRequest<T> request) {
this.request = request;
}
}
public class MyRequest{
private List<T> myobjects;
public void setMyObjects(List<T> ets) {
this.myobjects = ets;
}
@NotNull
@JsonIgnore
public T getMyObject() {
return myobjects.get(0);
}
}
Agora, o problema é que, quando chamo getMyObject (), que está dentro do objeto de solicitação, jackson retorna o objeto personalizado aninhado como um LinkedHashMap. Existe alguma maneira de especificar que o objeto T precisa ser retornado ?. Por exemplo: se eu enviei um objeto do tipo Cliente, então o Cliente deve ser retornado dessa Lista ?.
Obrigado.
TypeReference
abstrato?Respostas:
Este é um problema bem conhecido com o apagamento de tipo Java: T é apenas uma variável de tipo e você deve indicar a classe real, geralmente como argumento de classe. Sem essas informações, o melhor que pode ser feito é usar limites; e o T simples é quase o mesmo que 'T estende o objeto'. E Jackson irá vincular objetos JSON como mapas.
Nesse caso, o método do testador precisa ter acesso à classe, e você pode construir
e depois
fonte
'JavaType' funciona !! Eu estava tentando desempacotar (desserializar) uma lista em string json para objetos java ArrayList e estava lutando para encontrar uma solução desde dias.
Abaixo está o código que finalmente me deu a solução. Código:
fonte
IOException
(precisa apenas de uma captura), e que o introspector de anotação padrão já éJacksonAnnotationIntrospector
- portanto, não há necessidade de fazer nadaObjectMapper
, apenas construa e funciona.Eu modifiquei a resposta de rushidesai1 para incluir um exemplo de trabalho.
JsonMarshaller.java
Resultado
JsonMarshallerUnmarshaller.java
Station.java
data.json
fonte