1
resposta

Como obter objeto da raiz?

Os exemplos que vi na documentação sempre mostram que o objeto de retorno deveria ser nomeado ex:

{
    "topico":{
        "id": 1,
        "titulo": "Dúvida",
        "mensagem": "Erro ao criar projeto",
        "dataCriacao": "2019-05-05T18:00:00",
        "nomeAutor": "Aluno",
        "status": "NAO_RESPONDIDO",
        "respostas": []
    }
}

Mas no meu caso, tenho algumas APIs com o retorno direto na raiz

{
    "id": 1,
    "titulo": "Dúvida",
    "mensagem": "Erro ao criar projeto",
    "dataCriacao": "2019-05-05T18:00:00",
    "nomeAutor": "Aluno",
    "status": "NAO_RESPONDIDO",
    "respostas": []
}

Como trabalhar com este tipo de estrutura? Tentei com o get apenas ` - Get a Object graph with no named root element as a Java object. - mas na hora da conversão para POJO... aparentemente o jsonPath não esta conseguindo fazer o cast corretamente e esta deixando os atributos como HashMap.

java.lang.ClassCastException: java.util.HashMap cannot be cast to br.com.caelum.forum.modelo.TopicoDto
    at br.com.caelum.leilao.teste.TopicosTest.listaTopicos(TopicosTest.java:64)
1 resposta

Olá, Vinícius, tudo certo?

Uma forma de lidar com esse tipo de estrutura é utilizando a biblioteca Gson, que é uma biblioteca Java desenvolvida pelo Google para trabalhar com JSON. Com ela, você pode fazer a conversão do JSON para um objeto Java de forma mais fácil e precisa.

Por exemplo:

import com.google.gson.Gson;

// ...

String json = "{ \"id\": 1, \"titulo\": \"Dúvida\", \"mensagem\": \"Erro ao criar projeto\", \"dataCriacao\": \"2019-05-05T18:00:00\", \"nomeAutor\": \"Aluno\", \"status\": \"NAO_RESPONDIDO\", \"respostas\": [] }";

Gson gson = new Gson();
TopicoDto topico = gson.fromJson(json, TopicoDto.class);

Confira se a classe TopicoDto está mapeada com os atributos correspondentes ao JSON.

Dessa forma, você poderá trabalhar com o objeto topico normalmente, acessando seus atributos e métodos.

Espero ter ajudado e bons estudos!