A documentação de ligação de dados de Jackson indica que Jackson suporta desserialização de "Matrizes de todos os tipos suportados", mas não consigo descobrir a sintaxe exata para isso.
Para um único objeto, eu faria isso:
//json input
{
"id" : "junk",
"stuff" : "things"
}
//Java
MyClass instance = objectMapper.readValue(json, MyClass.class);
Agora, para uma matriz, quero fazer isso:
//json input
[{
"id" : "junk",
"stuff" : "things"
},
{
"id" : "spam",
"stuff" : "eggs"
}]
//Java
List<MyClass> entries = ?
Alguém sabe se existe um comando faltando magia? Se não, então qual é a solução?
Respostas:
Primeiro, crie um mapeador:
Como matriz:
Como lista:
Outra maneira de especificar o tipo de lista:
fonte
JsonMappingException: No suitable constructor found for type
esse, significa que você precisará adicionar um construtor padrão à sua classe, adicionando um construtor privado no-arg o corrigiu para mim.static
- caso contrário, elas nunca têm construtor de zero-arg.List<MyClass> myObjects = Arrays.asList(mapper.readValue(json, MyClass[].class))
funciona até 10 vezes mais rápido que o TypeRefence.De Eugene Tskhovrebov
Esta solução parece ser a melhor para mim
fonte
ResourceNotFoundException
Arrays.asList(Json.fromJson(json.get("fieldName"), MyClass[].class))
List<MyClass> myObjects = Arrays.asList(mapper.treeToValue(jsonNode.get("fieldName"), MyClass[].class))
Para implementação genérica:
fonte
Primeiro, crie uma instância do ObjectReader que seja segura para threads.
Então use-o:
fonte
fonte
aqui está um utilitário que pode transformar json2object ou Object2json, qualquer que seja seu pojo (entidade T)
fonte
você também pode criar uma classe que se estende
ArrayList
:public static class MyList extends ArrayList<Myclass> {}
e depois use-o como:
fonte
Não consegui usar esta resposta porque meu linter não permitirá lançamentos não verificados.
Aqui está uma alternativa que você pode usar. Eu sinto que é realmente uma solução mais limpa.
fonte