Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Erro ao receber dados via Json usando RETROFIT.

Boa tarde. Gostaria de pedir uma ajuda. Já tentei depurar o código aqui de todo jeito e não consegui resolver.

Estou buscando via get dados em um servidor REST.

Subi os arquivos para o github para ficar mais fácil analizar.

Esse trecho de código está no ExameDAO

private List<Exame> populaExames(Cursor c) {
        List<Exame> exames = new ArrayList<Exame>();

        while(c.moveToNext()){
            Exame exame = new Exame();
            Log.i("populaExame", "numero: " + c.getString(c.getColumnIndex("numero")) + " - data: " + c.getString(c.getColumnIndex("dataexame")));
            exame.setNumero(c.getString(c.getColumnIndex("numero")));
            exame.setId(c.getString(c.getColumnIndex("id")));
            exame.setTipo(c.getString(c.getColumnIndex("tipo")));
            exame.setDataexames(c.getString(c.getColumnIndex("dataexame")));
            exame.setResultado(c.getString(c.getColumnIndex("resultado")));
            String categoria = c.getString(c.getColumnIndex("categoria"));
            if(categoria == null || categoria == ""){
                exame.setCategoria("");
            } else{
                exame.setCategoria(categoria);
            }
            exames.add(exame);

        }
        return exames;
    }

Coloquei um Log.i para mostrar a data dos exames, fato é que essa data do exame quando recebe no arquivo Json, ela aparece como exemplo abaixo, e quando vou armazenala no banco ela está como null. Veja o retorno no Logcat:

D/OkHttp: {"exame":[{"numero":"1","id":"13301","tipo":"TE\u00d3RICO","dataexame":"05\/12\/13","cfc":"08:00","detran":"08:00","resultado":"APTO","categoria":null},{"numero":"2","id":"13303","tipo":"MEDICO","dataexame":"06\/11\/13","cfc":"08:00","detran":"08:00","resultado":"APTO","categoria":null},{"numero":"3","id":"13304","tipo":"PR\u00c1TICO","dataexame":"05\/06\/14","cfc":"08:00","detran":"08:00","resultado":"INAPTO","categoria":"A"},{"numero":"4","id":"13305","tipo":"PR\u00c1TICO","dataexame":"04\/04\/14","cfc":"08:00","detran":"08:00","resultado":"INAPTO","categoria":"B"},{"numero":"5","id":"14787","tipo":"PR\u00c1TICO","dataexame":"25\/04\/14","cfc":"08:00","detran":"08:00","resultado":"APTO","categoria":"B"},{"numero":"6","id":"15499","tipo":"PR\u00c1TICO","dataexame":"28\/08\/14","cfc":"08:00","detran":"08:00","resultado":"INAPTO","categoria":"A"},{"numero":"7","id":"15748","tipo":"PR\u00c1TICO","dataexame":"26\/09\/14","cfc":"08:00","detran":"08:00","resultado":"INAPTO","categoria":"A"},{"numero":"8","id":"15937","tipo":"PR\u00c1TICO","dataexame":"17\/10\/14","cfc":"08:00","detran":"08:00","resultado":"APTO","categoria":"A"}]}
D/OkHttp: <-- END HTTP (1143-byte body)
I/pegaDadosExames: null
I/Exame: 13301 - data: null
I/pegaDadosExames: null
I/Exame: 13303 - data: null
I/pegaDadosExames: null
I/Exame: 13304 - data: null
I/pegaDadosExames: null
I/Exame: 13305 - data: null
I/pegaDadosExames: null
I/Exame: 14787 - data: null
I/pegaDadosExames: null
I/Exame: 15499 - data: null
I/pegaDadosExames: null
I/Exame: 15748 - data: null
I/pegaDadosExames: null
I/Exame: 15937 - data: null

Veja uma outra classe FinanceiroDAO que me retorna no Logcat:

D/OkHttp: {"financeiro":[{"numero":"1","id":"92879","descricao":"PROCESSO","valor":"1410","vencimento":"07\/10\/13","pagto":"07\/10\/13","restante":"0"},.....
D/OkHttp: <-- END HTTP (1999-byte body)
I/pegaDadosFinanceiro: 07/10/13
I/pegaDadosFinanceiro: 10/03/14
I/pegaDadosFinanceiro: 20/02/14
8 respostas

Oi Isaac, blz?

Pelo o que tudo indica, está acontecendo algum problema no parse do JSON que representa um exame de acordo com a classe modelo que você criou.

Você pode me enviar a classe Exame, o service, e o código que faz a request via GET, por favor? Dessa forma, ficará mais fácil de identificar o motivo da falha de conversão.

[]s

Exame:

public class Exame {

    private String numero;
    private String id;
    private String tipo;
    private String dataexames;
    private String resultado;
    private String categoria;

    public String getNumero() {
        return numero;
    }

    public void setNumero(String numero) {
        this.numero = numero;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getTipo() {
        return tipo;
    }

    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    public String getDataexames() {
        return dataexames;
    }

    public void setDataexames(String dataexames) {
        this.dataexames = dataexames;
    }

    public String getResultado() {
        return resultado;
    }

    public void setResultado(String resultado) {
        this.resultado = resultado;
    }

    public String getCategoria() {
        return categoria;
    }

    public void setCategoria(String categoria) {
        this.categoria = categoria;
    }

    @Override
    public String toString() {
        return getId() + " - " + getCategoria() + getDataexames();
    }
}

Exame Service:

public interface ExameService {


    @GET("meusexames/{idProcesso}")
    Call<ExameSync> lista(@Path("idProcesso") String idProcesso);
}

RetrofitInicializador

public class RetrofitInicializador {

    private final Retrofit retrofit;

    public RetrofitInicializador(){

        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

        OkHttpClient.Builder client =  new OkHttpClient.Builder();
        client.addInterceptor(interceptor);

        retrofit = new Retrofit.Builder().baseUrl("http://appautoescola.com.br/unici_restserver/api/")
                .addConverterFactory(GsonConverterFactory.create())
                .client(client.build())
                .build();
    }

    public PerfilService getPerfilService() {
        return retrofit.create(PerfilService.class);
    }

    public FinanceiroService getFinanceiroService(){
        return retrofit.create(FinanceiroService.class);
    }


    public LoginService getLoginService() {
        return retrofit.create(LoginService.class);
    }

    public ExameService getExameService(){
        return retrofit.create(ExameService.class);
    }

    public AulaService getAulaService() {
        return retrofit.create(AulaService.class);
    }
}

Classe dentro do arquivo exameFragment que chama dentro do onResume o

public void onResume() {
        super.onResume();

        LoginDAO dao = new LoginDAO(getContext());
        idProcesso = dao.buscaIdProcesso();
        dao.close();

        Call<ExameSync> call = new RetrofitInicializador().getExameService().lista(idProcesso);

        call.enqueue(new Callback<ExameSync>() {
            @TargetApi(Build.VERSION_CODES.M)
            @Override
            public void onResponse(Call<ExameSync> call, Response<ExameSync> response) {
                ExameSync exameSync = response.body();
                ExameDAO dao = new ExameDAO(getContext());
                dao.sincroniza(exameSync.getExames());
                carregaLista();
                dao.close();
            }

            @Override
            public void onFailure(Call<ExameSync> call, Throwable t) {

            }
        });


        carregaLista();

    }


  @TargetApi(Build.VERSION_CODES.M)
    private void carregaLista()  {
        ExameDAO dao = new ExameDAO(getContext());
        List<Exame> exames = dao.buscaExame();
        dao.close();

        ExameAdapter adapter = new ExameAdapter(getContext(), exames);
        listaExame.setAdapter(adapter);

    }

Me manda também a ExameSync, pois ela que está realizando a conversão. Só me confirma se é esse JSON que está querendo converter:

{
    "exame": [
        {"numero":"1","id":"13301","tipo":"TE\u00d3RICO","dataexame":"05\/12\/13","cfc":"08:00","detran":"08:00","resultado":"APTO","categoria":null},
        {"numero":"2","id":"13303","tipo":"MEDICO","dataexame":"06\/11\/13","cfc":"08:00","detran":"08:00","resultado":"APTO","categoria":null},
        {"numero":"3","id":"13304","tipo":"PR\u00c1TICO","dataexame":"05\/06\/14","cfc":"08:00","detran":"08:00","resultado":"INAPTO","categoria":"A"},
        {"numero":"4","id":"13305","tipo":"PR\u00c1TICO","dataexame":"04\/04\/14","cfc":"08:00","detran":"08:00","resultado":"INAPTO","categoria":"B"},
        {"numero":"5","id":"14787","tipo":"PR\u00c1TICO","dataexame":"25\/04\/14","cfc":"08:00","detran":"08:00","resultado":"APTO","categoria":"B"},
        {"numero":"6","id":"15499","tipo":"PR\u00c1TICO","dataexame":"28\/08\/14","cfc":"08:00","detran":"08:00","resultado":"INAPTO","categoria":"A"},
        {"numero":"7","id":"15748","tipo":"PR\u00c1TICO","dataexame":"26\/09\/14","cfc":"08:00","detran":"08:00","resultado":"INAPTO","categoria":"A"},
        {"numero":"8","id":"15937","tipo":"PR\u00c1TICO","dataexame":"17\/10\/14","cfc":"08:00","detran":"08:00","resultado":"APTO","categoria":"A"}
    ]
}

Um outro teste que vou pedir é a adição de um log para o exameSync quando você o cria a partir do body() do response, veja se ele está recebendo os objetos certinho, se não tiver, me avisa também o que acontece.

[]s

Segue ExameSync:

public class ExameSync {

    private List<Exame> exame;

    public List<Exame> getExames(){
        return exame;
    }


}

Sim é esse Json que estou querendo converter. e o problema é com a dataexame, como eu havia dito.

Coloquei o log como pediu

Log.i("Examesync",""+ exameSync.getExames());

Resposta no logcat

I/Examesync: [13301 - nullnull, 13303 - nullnull, 13304 - Anull, 13305 - Bnull, 14787 - Bnull, 15499 - Anull, 15748 - Anull, 15937 - Anull]

solução!

Olhando por cima parece que tem uma diferença no nome do atributo (junto dos seus getters e setters), repare que na classe tá como dataexames em plural e no JSON apenas dataexame em singular.

Faça a modificação ou na classe Exame para que fique dataexame e veja se funciona. Lembre-se de modificar também o nome dos getters e setters.

Muito Obrigado, Resolvido. Não acredito que era um erro tão bobo. Esse vicio de leitura que as vezes me joga no mato, estou com o mesmo problema em uma outra classe. Com certeza vai ser isso.

Opa Isaac, isso é mais comum do que parece hehe

Sempre que tiver valores null lembre-se de checkar primeiro os nomes dos atributos, depois os tipos, e depois a estrutura do dado que está tentando receber ;)

[]s

Obrigado, dica anotada.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software