2
respostas

Como recuperar desserializar uma lista de objetos JSON

Percebi que o retorno Json de uma lista de usuários não é conversível diretamente para uma List, ao contrário da abordagem XML. Há uma forma mais direta de efetuar tal conversão, sem ter que consultar objeto por objeto?

(a) a resposta JSON ao URL: http://localhost:8080/usuarios?_format=json

{
  "list": [
    {
      "id": 1,
      "nome": "Mauricio Aniche",
      "email": "mauricio.aniche@caelum.com.br"
    },
    {
      "id": 2,
      "nome": "Guilherme Silveira",
      "email": "guilherme.silveira@caelum.com.br"
    }
  ]
}
  • parece não possuir uma associação direta com o tipo "usuário"...

(b) a chamada

ArrayList<Usuario> lista = path.getList("list", Usuario.class);

retorna um erro, indicando que os elementos da lista são do tipo "HashMap";

(c) a chamadapath.getList("list");

também retorna uma lista de objetos "HashMap".

Com o xmlPath havia uma forma direta de conversão! Comopodemos fazer isso com jsonPath??

2 respostas

Você precisa criar uma nova classe que tem uma lista como atributo. Aí você faz a conversão para essa classe.

Obrigado pela dicas, Alberto.

Não é complicado criar um conversor, mas ainda achei estranho esse comportamento, porque a API do método JsonPath.getList sugere que ele deveria funcionar exatamente como o XmlPath.getList.

Encontrei a solução numa pergunta de 11/2016: Como faço para testar a lista de leilões usando Json?.

Tentei atualizar a biblioteca no projeto original, sem sucesso. Obtive sucesso após criar um novo projeto mavenizado com junit 4.12 rest-assured, xml-path e json-path 3.0.3 * gson 2.81,

e mover as classes do projeto para lá.

Agora temos o comportamento esperado, tanto para lista de usuários como de leilões, permitindo a conversão direta de JSON para uma lista de objetos de entidade:

@Test
public void testarGetUsuariosListJson_C() {
    JsonPath path = RestAssured.given()
                .header("Accept", "application/json")
                .get("/usuarios")
                .andReturn().jsonPath();

*    List<Usuario> usuarios = path.getList("list", Usuario.class);

    List<Usuario> usuariosEsperados = Arrays.asList(new Usuario[] {
                mauricio,
                guilherme
            });

    Assert.assertEquals(usuariosEsperados, usuarios);
}
@Test
public void deveRetornarListaDeLeiloesJson() {
    JsonPath path = RestAssured.given()
                .header("Accept", "application/json")
                .get("/leiloes")
                .andReturn().jsonPath();

*    List<Leilao> leiloes = path.getList("list", Leilao.class);

    Assert.assertEquals(leilaoGeladeira, leiloes.get(0));
    Assert.assertEquals(leilaoXbox, leiloes.get(1));
}

Aproveito para sugerir mavenizar e atualizar as referências às bibliotecas usadas no projeto de referência do curso.

Obrigado!