Tenho uma classe Java MyPojo
que estou interessado em desserializar do JSON. Eu configurei uma classe MixIn especial,, MyPojoDeMixIn
para me ajudar com a desserialização. MyPojo
tem apenas int
e String
variáveis de instância combinadas com getters e setters adequados. MyPojoDeMixIn
parece algo assim:
public abstract class MyPojoDeMixIn {
MyPojoDeMixIn(
@JsonProperty("JsonName1") int prop1,
@JsonProperty("JsonName2") int prop2,
@JsonProperty("JsonName3") String prop3) {}
}
No meu cliente de teste eu faço o seguinte, mas é claro que não funciona em tempo de compilação porque há JsonMappingException
uma incompatibilidade de tipo relacionada.
ObjectMapper m = new ObjectMapper();
m.getDeserializationConfig().addMixInAnnotations(MyPojo.class,MyPojoDeMixIn.class);
try { ArrayList<MyPojo> arrayOfPojo = m.readValue(response, MyPojo.class); }
catch (Exception e) { System.out.println(e) }
Estou ciente de que poderia aliviar esse problema criando um objeto "Resposta" que contenha apenas um ArrayList<MyPojo>
, mas, então, teria de criar esses objetos um tanto inúteis para cada tipo que desejo retornar.
Eu também olhei online em JacksonInFiveMinutes, mas tive um péssimo momento para entender as coisas Map<A,B>
e como elas se relacionam com o meu problema. Se você não sabe, sou totalmente novo em Java e venho de uma formação Obj-C. Eles mencionam especificamente:
Além da vinculação a POJOs e tipos "simples", há uma variante adicional: a vinculação a contêineres genéricos (tipificados). Este caso requer tratamento especial devido ao chamado Type Erasure (usado por Java para implementar genéricos de uma maneira compatível com versões anteriores), que impede você de usar algo como Collection.class (que não compila).
Portanto, se você quiser vincular dados a um mapa, precisará usar:
Map<String,User> result = mapper.readValue(src, new TypeReference<Map<String,User>>() { });
Como posso desserializar diretamente para ArrayList
?
Respostas:
Você pode desserializar diretamente para uma lista usando o
TypeReference
wrapper. Um exemplo de método:E é usado assim:
TypeReference Javadoc
fonte
TypeReference
- eu simplesmente não entendo como fazer isso ... Consulte minha edição acima para obter as instruções sobre como usar os genéricos.arrayList.toString()
about aNullPointerException
. Suponho que isso possa ser porque meuPOJO
não está de acordo com as convenções de nomenclatura corretas para suas propriedades, ou seja, todo o problema é que o serviço da web retornaProp1Member
e meu objeto simProp1
. Este é o único motivo real pelo qual estou usando mixins para começar, então não tenho que colocar as declarações for@JsonProperty
em meus objetos puros.Outra maneira é usar uma matriz como um tipo, por exemplo:
Dessa forma, você evita todo o incômodo com o objeto Type e, se realmente precisar de uma lista, pode sempre converter a matriz em uma lista:
IMHO isso é muito mais legível.
E para torná-la uma lista real (que pode ser modificada, veja as limitações de
Arrays.asList()
), faça o seguinte:fonte
TypeFactory
conforme descrito na próxima resposta: stackoverflow.com/a/42458104/91497 é a maneira Jackson de especificar o tipo.Esta variante parece mais simples e elegante.
fonte
Eu também estou tendo o mesmo problema. Eu tenho um json que deve ser convertido em ArrayList.
A conta tem esta aparência.
Todas as classes acima foram anotadas corretamente. Tentei TypeReference> () {} mas não está funcionando.
Ele me dá Arraylist, mas ArrayList tem um linkedHashMap que contém mais alguns hashmaps vinculados contendo valores finais.
Meu código é o seguinte:
Eu finalmente resolvi o problema. Consigo converter a Lista em String Json diretamente para ArrayList da seguinte maneira:
fonte
Isso funciona para mim.
fonte