无法从START_ARRAY令牌中反序列化java.lang.Boolean实例

时间:2019-06-10 19:01:40

标签: android serialization jackson

我需要处理调用的返回,但是它可以返回布尔值或对象。找到电话号码后,它立即崩溃为onFailure。

我正在寻找解决方案,但发现所有问题都无法解决我的问题。

我的界面:

public interface PessoaService {

    @FormUrlEncoded
    @POST("Pessoa/BuscaContatosAgenda/")
    Call<Boolean> buscaContatoAgenda(@Field("Identificador") String identificador,
                                     @Field("UnidadeId") String unidadeId,
                                     @Field("Telefones") ArrayList<String> telefone);
}

我的RetrofitConfig

public class RetrofitConfig {
    private final Retrofit retrofit;

    public RetrofitConfig() {
        this.retrofit = new Retrofit.Builder()
                .baseUrl(DadosEmpresa.URL)
                //O método addConverterFactory recebe a classe que será responsável por lidar com a conversão
                .addConverterFactory(JacksonConverterFactory.create())
                //Utilizamos o método build para criar o objeto Retrofit
                .build();
    }

    public PessoaService getBuscaContatoAgenda() {
        return this.retrofit.create(PessoaService.class);
    }
}

我的活动功能:

 private void verificandoContatos() {
        cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                null, null, null, ContactsContract.Contacts.DISPLAY_NAME);

        telefonesArrayList = new ArrayList<>();
        while (cursor.moveToNext()) {
            String telefone = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            telefonesArrayList.add(telefone);
        }
        cursor.close();

        Call<Boolean> call = new RetrofitConfig().getBuscaContatoAgenda().buscaContatoAgenda(pessoa.getIdentificador(), DadosEmpresa.UnidadeID, telefonesArrayList);
        call.enqueue(new Callback<Boolean>() {
            @Override
            public void onResponse(Call<Boolean> call, Response<Boolean> response) {
                if (response.body() == true) {
                    Toast.makeText(AgendaContatoActivity.this, "Nenhum contato foi encontrado na sua agenda!", Toast.LENGTH_LONG).show();
                } else if (response.body() == false) {
                    Toast.makeText(AgendaContatoActivity.this, "Ocorreu um erro inesperado. Tente novamente mais tarde.", Toast.LENGTH_LONG).show();
                    Log.e(TAG, "onResponse: " + response.body().toString());
                } else {
                    Toast.makeText(AgendaContatoActivity.this, "Esses são seus contatos encontrados", Toast.LENGTH_LONG).show();
                    createRecyclerView();
                }
            }

            @Override
            public void onFailure(Call<Boolean> call, Throwable t) {
                Log.e(TAG, "onFailure: Erro ao enviar contatos: " + t.getMessage());
                Toast.makeText(getBaseContext(), "Ocorreu um erro inesperado. Tente novamente.", Toast.LENGTH_LONG).show();

            }
        });
    }
  

t.getMessage = com.fasterxml.jackson.databind.JsonMappingException:   无法从START_ARRAY中反序列化java.lang.Boolean的实例   令牌,位于[来源:okhttp3.ResponseBody$BomAwareReader@f41ca80;线:   1,列:1]

编辑/更新/解决方案

寻求帮助后,我找到了解决问题的方法。不是最好的方法,但是可以解决此问题:

 private void verificandoContatos() {
        cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                null, null, null, ContactsContract.Contacts.DISPLAY_NAME);

        telefonesArrayList = new ArrayList<>();
        while (cursor.moveToNext()) {
            String telefone = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            telefonesArrayList.add(telefone);
        }
        cursor.close();

        Call<ArrayList<GetContatoAgenda>> call = new RetrofitConfig().getBuscaContatoAgenda().buscaContatoAgenda(pessoa.getIdentificador(), DadosEmpresa.UnidadeID, telefonesArrayList);
        call.enqueue(new Callback<ArrayList<GetContatoAgenda>>() {
            @Override
            public void onResponse(Call<ArrayList<GetContatoAgenda>> call, Response<ArrayList<GetContatoAgenda>> response) {
                Toast.makeText(AgendaContatoActivity.this, "Esses são seus contatos encontrados em nossa aplicativo!", Toast.LENGTH_LONG).show();
                contatoArrayList = new ArrayList<GetContatoAgenda>();
                //Como a Callback do Retrofit já faz o mapeamento, então fazemos o contatoArrayList receber a response.body();
                contatoArrayList = response.body();
                createRecyclerView();
            }

            @Override
            public void onFailure(Call<ArrayList<GetContatoAgenda>> call, Throwable t) {
                Log.e(TAG, "onFailure: Erro ao enviar contatos: " + t.getMessage());
                Toast.makeText(getBaseContext(), "Ocorreu um erro inesperado. Tente novamente.", Toast.LENGTH_LONG).show();

            }
        });
    }

1 个答案:

答案 0 :(得分:0)

问题出在您的模型中。您需要确保获得的JSON响应100%适合用于反序列化的模型 这条线是个问题。这里假设是您在评论中显示的模型

Call<Boolean> call

当您收到JSON响应时,您想从中解析数据。那是个好话题,怎么做 Android parse JSONObject