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

Erro ao desserializar Retrofit

Bom dia Pessoal. Estou com problemas para entender o retrofit e gostaria de uma ajuda de vocês para entender o que está ocorrendo. Construi um WCF em C# que está me dando o seguinte retorno

D/OkHttp: {"retornoPalavra":[{"id":"111111111111111111111111111111111111","nivelDificuldade":1,"palavraIngles":"Hello","palavraPortugues":"Olá"}]}

porém ele não consegue deserializar.. dá o seguinte erro:

E/onFailure chamado: Unrecognized field "retornoPalavra" (class com.ericmiranda.mynotes.dto.PalavraSync), not marked as ignorable (one known property: "palavras"])
                                                                                at [Source: okhttp3.ResponseBody$BomAwareReader@c646b8b; line: 1, column: 14] (through reference chain: com.ericmiranda.mynotes.dto.PalavraSync["retornoPalavra"])

Minha estrutura está da seguinte forma: Classe Palavra

public class Palavra implements Serializable {

    private String id;
    private String palavraPortugues;
    private String palavraIngles;
    private int nivelDificuldade;

    public String getId() {
        return id;
    }

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

    public String getPalavraPortugues() {
        return palavraPortugues;
    }

    public void setPalavraPortugues(String palavraPortugues) {
        this.palavraPortugues = palavraPortugues;
    }

    public String getPalavraIngles() {
        return palavraIngles;
    }

    public void setPalavraIngles(String palavraIngles) {
        this.palavraIngles = palavraIngles;
    }

    public int getNivelDificuldade() {
        return nivelDificuldade;
    }

    public void setNivelDificuldade(int nivelDificuldade) {
        this.nivelDificuldade = nivelDificuldade;
    }

    @Override
    public String toString() {
        return getPalavraIngles();
    }
}

Classe PalavraSync

public class PalavraSync {

    private List<Palavra> retornoPalavra;

    public List<Palavra> getPalavras (){return retornoPalavra;}

}

Minha interface está da seguinte forma (estou utilizando o método RetornarListaPalavraArray)

public interface MyNotesService {

    @POST("InserirPalavra")
    Call<Void>InserirPalavra(@Body Palavra palavra);

    @GET("RetornarListaPalavraArray")
    Call<PalavraSync>listaPalavraArray();

}

O fragmento de código onde faço a chamada retrofit

       //region Iniciando a chamada dos dados do servidor 
        Call<PalavraSync> call = new RetrofitInicializador().getMyNotesService().listaPalavraArray();
        call.enqueue(new Callback<PalavraSync>() {
            @Override
            public void onResponse(Call<PalavraSync> call, Response<PalavraSync> response) {
                PalavraSync lista = response.body();
                NotesDAO dao = new NotesDAO(getContext());
                dao.sincronizaPalavra(lista.getPalavras());
                dao.close();
                carregaLista();

                swipeListaPalavras.setRefreshing(false);

            }

            @Override
            public void onFailure(Call<PalavraSync> call, Throwable t) {
                Log.e("onFailure chamado", t.getMessage());
                swipeListaPalavras.setRefreshing(false);
            }
        });
        //endregion

Por fim o fragmento de código onde tento ler o retorno

    public void sincronizaPalavra(List<Palavra> listaPalavras){
        String x = "valor";
        for (Palavra itemPalavra:
                listaPalavras) {
            if (palavraIsCadastrada(itemPalavra)){
                alteraPalavra(itemPalavra);
            }else {
                inserePalavra(itemPalavra);
            }
        }
    }

OBS: Se ao invés de colocar o retono

{"retornoPalavra":[{"id":"111111111111111111111111111111111111","nivelDificuldade":1,"palavraIngles":"Hello","palavraPortugues":"Olá"}]}

colocar desta forma

{"palavras":[{"id":"111111111111111111111111111111111111","nivelDificuldade":1,"palavraIngles":"Hello","palavraPortugues":"Olá"}]}

ele funciona.. agora não consegui entender a relação.

2 respostas
solução!

Oi Eric, tudo bem?

Considerando o feedback final da situação que você passou, acredito que o problema é o nome do método de acesso getPalavras() com o nome do atributo retornoPalavra. Provavelmente, o módulo de parse de JSON para objeto que você está usando ele considera o campo com o seu modificado de acesso.

Em outras palavras, se deixar como getRetornoPalavra() ao invés de getPalavras(), provavelmente ele vai conseguir fazer o parse como você espera :)

[]s

Perfeito Alex.. Funcionou perfeitamente. Muito obrigado pela ajuda.