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

Erro ao retornar lista de objetos webservice - Android Studio

Bom dia pessoal, estou com problemas para retornar e exibir uma lista de objetos de um webservice. No caso ao tentar retornar estes objetos meu código dispara a seguinte Exception:

java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $

A minha classe esta desta forma:

public class Documento implements Serializable {
    private String Cd_Filial;
    private String Cd_Cod_Doc;
    private String Dt_Movimento;
    private String Cd_Cod_Produto;
    private String Cd_Localizacao;
    private String Nr_Documento;
    private String Qtd_Recebida;
    private String Qtd_Aceita;
    private String Qtd_Vendida;
    private String Qtd_Perda;
    private String Qtd_Devolver;
    private String Qtd_Devolvida;
    @Override
    public String toString(){
        return "Filial: " + getCd_Filial()
                + "\nCódigo: " + getCd_Cod_Doc()
                + "\nLocalização: " + getCd_Localizacao()
                + "\nData: " + getDt_Movimento();

    }
}

E minha outra classe que faz a chamada do webservice esta desta forma:

public class HTTPCarregaLista extends AsyncTask<Void, Void, List<Documento>> {

    private final String filial;

    public HTTPCarregaLista(String filial) {
        this.filial = filial;
    }

    @Override
    protected List<Documento> doInBackground(Void... Void) {

        List<Documento> docs = new ArrayList<Documento>();

        StringBuilder resposta = new StringBuilder();

        try {
            URL url = new URL("http://www.acessoseg.com.br/webservicesalao/api/documento/" + this.filial);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setRequestProperty("Content-type", "application/json");
            connection.setRequestProperty("Accept", "application/json");
            connection.setDoOutput(true);
            connection.setConnectTimeout(5000);
            connection.connect();

            Scanner scanner = new Scanner(url.openStream());
            while(scanner.hasNext()){
                resposta.append(scanner.nextLine());
            }

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (ProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return Collections.singletonList(new Gson().fromJson(resposta.toString(), Documento.class));

    }

}

Adapter para classe Documento:

public class AdapterDocumento extends BaseAdapter {

    private final List<Documento> documentoList;
    private final Context context;

    public AdapterDocumento(List<Documento> documentoList, Context context) {
        this.documentoList = documentoList;
        this.context = context;
    }

    @Override
    public int getCount() {
        return documentoList.size();
    }

    @Override
    public Object getItem(int position) {
        return documentoList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return Long.parseLong(documentoList.get(position).getCd_Cod_Doc());
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        Documento documento = documentoList.get(position);
        LayoutInflater inflater = LayoutInflater.from(context);

        View view = convertView;
        if (view == null) {
            view = inflater.inflate(R.layout.list_item, parent, false);
        }

        TextView campofilial = (TextView) view.findViewById(R.id.item_filial);
        campofilial.setText(documento.getCd_Filial());

        TextView campodata = (TextView) view.findViewById(R.id.item_data);
        campodata.setText(documento.getDt_Movimento());

        TextView camponum = (TextView) view.findViewById(R.id.item_num);
        camponum.setText(documento.getDt_Movimento());

        TextView campoloc = (TextView) view.findViewById(R.id.item_loc);
        campoloc.setText(documento.getCd_Localizacao());

        return view;
    }
}

Se alguém puder ajudar desde já agradeço, se precisar de outras informações eu coloco aqui sem problemas.

Obs: a classe Documento possui Get/Set para todos os seus atributos, só não coloquei aqui para não fica muita coisa.

2 respostas

Ola, tudo bom Wesley

Você pode disponibilizar seu código pelo GitHub por exemplo?

Fica mais fácil para identificar o problema e propor uma solução.

solução!

Ola, desculpe a demora para responder. Eu consegui resolver este problema. No caso o problema era na classe "HTTPCarregaLista", eu precisava retornar uma lista de "Documento" e eu estava retornando uma lista de "Objetos", substitui o código:

return Collections.singletonList(new Gson().fromJson(resposta.toString(), Documento.class));

por:

Gson mGson = new Gson();

 return  Arrays.asList(mGson.fromJson(resposta.toString(), Documento[].class));

e funcionou normalmente.