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

Erro: Erro no parsing do JSON org.json.JSONException: Value <?xml of type java.lang.String cannot be converted to JSONArray

Estou com esse projeto de JSON. Alguém poderia me ajudar?

ERRO:

08-30 18:53:09.965 2385-2635/com.exemplo.informacoes E/Erro: Erro no parsing do JSON org.json.JSONException: Value <?xml of type java.lang.String cannot be converted to JSONArray at org.json.JSON.typeMismatch(JSON.java:111) at org.json.JSONArray.(JSONArray.java:96) at org.json.JSONArray.(JSONArray.java:108) at com.exemplo.informacoes.ConsumirJsonActivity$DownloadJsonAsyncTask.getPessoas(ConsumirJsonActivity.java:109) at com.exemplo.informacoes.ConsumirJsonActivity$DownloadJsonAsyncTask.doInBackground(ConsumirJsonActivity.java:75) at com.exemplo.informacoes.ConsumirJsonActivity$DownloadJsonAsyncTask.doInBackground(ConsumirJsonActivity.java:51) at android.os.AsyncTask$2.call(AsyncTask.java:295) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) at java.lang.Thread.run(Thread.java:818) 08-30 18:53:10.011 2385-2634/com.exemplo.informacoes E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa39910e0 08-30 18:53:14.394 2385-2634/com.exemplo.informacoes E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa3991230

package com.exemplo.informacoes;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.AlertDialog;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;


public class ConsumirJsonActivity extends ListActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        new DownloadJsonAsyncTask()
                .execute("https://s3-sa-east-1.amazonaws.com/pontotel-docs/data,json");
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);

        Pessoa pessoa = (Pessoa) l.getAdapter().getItem(position);

        Intent intent = new Intent(this, InformacoesActivity.class);
        intent.putExtra("pessoa", pessoa);
        startActivity(intent);
    }

    class DownloadJsonAsyncTask extends AsyncTask<String, Void, List<Pessoa>> {
        ProgressDialog dialog;

        /*Exibe pop-up indicando que esta sendo feito o download do JSON*/
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            dialog = ProgressDialog.show(ConsumirJsonActivity.this, "Aguarde",
                    "Fazendo download do JSON");
        }

        //Acessa o servico do JSON e retorna a lista de pessoas
        @Override
        protected List<Pessoa> doInBackground(String... params) {
            String urlString = params[0];
            HttpClient httpclient = new DefaultHttpClient();
            HttpGet httpget = new HttpGet(urlString);
            try {
                HttpResponse response = httpclient.execute(httpget);
                HttpEntity entity = response.getEntity();
                if (entity != null) {
                    InputStream instream = entity.getContent();
                    String json = getStringFromInputStream(instream);
                    instream.close();
                    List<Pessoa> pessoas = getPessoas(json);
                    return pessoas;
                }
            } catch (Exception e) {
                Log.e("Erro", "Falha ao acessar Web service", e);
            }
            return null;
        }


        //Depois de executada a chamada do servico
        @Override
        protected void onPostExecute(List<Pessoa> result) {
            super.onPostExecute(result);
            dialog.dismiss();
            if (result.size() > 0) {
                ArrayAdapter<Pessoa> adapter = new ArrayAdapter<Pessoa>(
                        ConsumirJsonActivity.this,
                        android.R.layout.simple_list_item_1, result);
                setListAdapter(adapter);
            } else {
                AlertDialog.Builder builder = new AlertDialog.Builder(
                        ConsumirJsonActivity.this)
                        .setTitle("Erro")
                        .setMessage("Nao foi possivel acessar as informacoes!!")
                        .setPositiveButton("OK", null);
                builder.create().show();
            }
        }

        //Retorna uma lista de pessoas com as informacoes retornadas do JSON
        private List<Pessoa> getPessoas(String jsonString) {
            List<Pessoa> pessoas = new ArrayList<Pessoa>();
            try {
                JSONArray pessoasJson = new JSONArray(jsonString);
                JSONObject pessoa;

                for (int i = 0; i < pessoasJson.length(); i++) {
                    pessoa = new JSONObject(pessoasJson.getString(i));
                    Log.i("PESSOA ENCONTRADA: ",
                            "nome=" + pessoa.getString("nome"));

                    Pessoa objetoPessoa = new Pessoa();
                    objetoPessoa.setNome(pessoa.getString("nome"));
                    objetoPessoa.setCpf(pessoa.getString("CPF"));
                    objetoPessoa.setPws(pessoa.getString("PWS"));
                    pessoas.add(objetoPessoa);
                }

            } catch (JSONException e) {
                Log.e("Erro", "Erro no parsing do JSON", e);
            }
            return pessoas;
        }


        //Converte objeto InputStream para String
        private String getStringFromInputStream(InputStream is) {

            BufferedReader br = null;
            StringBuilder sb = new StringBuilder();

            String line;
            try {

                br = new BufferedReader(new InputStreamReader(is));
                while ((line = br.readLine()) != null) {
                    sb.append(line);
                }

            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (br != null) {
                    try {
                        br.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }

            return sb.toString();

        }

    }
}
8 respostas

Olá Cristiano,

De acordo com a mensagem de erro parece que a string que foi recebida no método getPessoas(...) não é um JSON e sim um XML. Para ter certeza, coloque um log no início desse método para imprimir a jsonString.

Uma outra coisa que reparei foi que no método onCreate(...) sua URL indica um arquivo data,json. Acho que a vírgula aqui deveria ser um ponto. Se isso não resolver faça o teste do log para ter uma ideia do problema.

Continuou o msm erro.

Como ficaria esse log que vc comentou?

É só você colocar no começo do método:

Log.i("ALURA", "Resposta do servidor:" + jsonString);

Quando você executar seu código, o log irá aparecer na aba inferior do Android Studio (6. Android). Faça uma busca por "Resposta do servidor" e em algum lugar do console deve aparecer ali o que você está recebendo do servidor.

Não esqueça de verificar aquele lance da vírgula na sua URL.

Olá jefersson, aparentemente ele esta tentando puxar os dados do JSON só que não esta conseguindo converter aparece o seguinte erro:

PS. Foi feito o import java.util.List e foi alterado a URL sim.

--------- beginning of crash 08-31 18:06:11.341 2292-2292/com.exemplo.informacoes E/AndroidRuntime: FATAL EXCEPTION: main Process: com.exemplo.informacoes, PID: 2292 java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference at com.exemplo.informacoes.ConsumirJsonActivity$DownloadJsonAsyncTask.onPostExecute(ConsumirJsonActivity.java:90) at com.exemplo.informacoes.ConsumirJsonActivity$DownloadJsonAsyncTask.onPostExecute(ConsumirJsonActivity.java:51) at android.os.AsyncTask.finish(AsyncTask.java:651) at android.os.AsyncTask.-wrap1(AsyncTask.java) at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 08-31 18:08:19.009 3990-3990/com.exemplo.informacoes W/System: ClassLoader referenced unknown path: /data/app/com.exemplo.informacoes-1/lib/x86 08-31 18:08:20.469 3990-3990/com.exemplo.informacoes W/System: ClassLoader referenced unknown path: /data/app/com.exemplo.informacoes-1/lib/x86 08-31 18:08:20.511 3990-4034/com.exemplo.informacoes D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true

[ 08-31 18:08:20.520 3990: 3990 D/ ] HostConnection::get() New Host Connection established 0xb40ada30, tid 3990

[ 08-31 18:08:20.578 3990: 4034 D/ ] HostConnection::get() New Host Connection established 0xb40addc0, tid 4034 08-31 18:08:20.582 3990-4034/com.exemplo.informacoes I/OpenGLRenderer: Initialized EGL, version 1.4 08-31 18:08:21.144 3990-4035/com.exemplo.informacoes I/ADRIANO: Resposta do servidor:{ "data": [ { "id": "1234", "name": "Afonso", "pwd": "9845" }, { "id": "asdfadsf54894", "name": "Alana", "pwd": "4812" }, { "id": "6584asdf", "name": "Mancini", "pwd": "4517" }, { "id": "6584asdf", "name": "Oliver", "pwd": "7485" }, { "id": "6584asdf", "name": "Lucas", "pwd": "8459" }, { "id": "6584asdf", "name": "Luzinete", "pwd": "2746" }, { "id": "6584asdf", "name": "Zion", "pwd": "3452" } ]} 08-31 18:08:21.145 3990-4035/com.exemplo.informacoes E/Erro: Erro no parsing do JSON org.json.JSONException: Value {"data":[{"id":"1234","name":"Afonso","pwd":"9845"},{"id":"asdfadsf54894","name":"Alana","pwd":"4812"},{"id":"6584asdf","name":"Mancini","pwd":"4517"},{"id":"6584asdf","name":"Oliver","pwd":"7485"},{"id":"6584asdf","name":"Lucas","pwd":"8459"},{"id":"6584asdf","name":"Luzinete","pwd":"2746"},{"id":"6584asdf","name":"Zion","pwd":"3452"}]} of type org.json.JSONObject cannot be converted to JSONArray at org.json.JSON.typeMismatch(JSON.java:111) at org.json.JSONArray.(JSONArray.java:96) at org.json.JSONArray.(JSONArray.java:108) at com.exemplo.informacoes.ConsumirJsonActivity$DownloadJsonAsyncTask.getPessoas(ConsumirJsonActivity.java:110) at com.exemplo.informacoes.ConsumirJsonActivity$DownloadJsonAsyncTask.doInBackground(ConsumirJsonActivity.java:75) at com.exemplo.informacoes.ConsumirJsonActivity$DownloadJsonAsyncTask.doInBackground(ConsumirJsonActivity.java:51) at android.os.AsyncTask$2.call(AsyncTask.java:295) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) at java.lang.Thread.run(Thread.java:818) 08-31 18:08:21.157 3990-4034/com.exemplo.informacoes E/Surface: getSlotFromBufferLocked: unknown buffer: 0xab1faea0 08-31 18:08:25.225 3990-4034/com.exemplo.informacoes E/Surface: getSlotFromBufferLocked: unknown buffer: 0xab1faea0

Certo, agora deu prá ver que ele tá trazendo um JSON mas o problema agora está aqui no processo de conversão no método getPessoas(...):

JSONArray pessoasJson = new JSONArray(jsonString);

Nessa linha estamos tentando converter a string do JSON que veio do servidor em uma lista mas vejamos o JSON que estamos recebendo:

{ "data": [ { "id": "1234", "name": "Afonso", "pwd": "9845" }, { "id": "asdfadsf54894", "name": "Alana", "pwd": "4812" }, { "id": "6584asdf", "name": "Mancini", "pwd": "4517" }, { "id": "6584asdf", "name": "Oliver", "pwd": "7485" }, { "id": "6584asdf", "name": "Lucas", "pwd": "8459" }, { "id": "6584asdf", "name": "Luzinete", "pwd": "2746" }, { "id": "6584asdf", "name": "Zion", "pwd": "3452" } ]}

Perceba que a JSON começa com um objeto { e dentro desse objeto temos uma lista associada com a chave "data". Isso significa que a string por enquanto representa um objeto JSON que tem uma lista dentro dele. Não podemos transformar esse objeto diretamente em uma lista. Precisamos primeiro transformar a string em um objeto JSON e pedir a lista associada a chave "data" para esse objeto. O código ficaria mais ou menos assim:

JSONObject objetoJson = new JSONObject(jsonString);
JSONArray pessoasJson = objetoJson.getJSONArray("data");

Tente começar com essa alteração e veja se ajuda!

Eu fiz o que vc pedi, ai começou a pedir para criar uma variável local e eu criei. continua dando o outro erro.

private List<Pessoa> getPessoas(String jsonString) {
            Log.i("ADRIANO", "Resposta do servidor:" + jsonString);
            List<Pessoa> pessoas = new ArrayList<Pessoa>();
            try {

                JSONObject objetoJson = new JSONObject(jsonString);
                JSONArray pessoasJson = objetoJson.getJSONArray("data");

                for (int i = 0; i < pessoasJson.length(); i++) {
                    Log.i("LISTANDO PESSOA: ",
                            "nome=" + objetoJson);
                    JSONObject pessoa = new JSONObject(pessoasJson.getString(i));     // aqui ele pediu para criar uma variável local (no caso eu criei  JSONObject pessoa).
                    Log.i("PESSOA ENCONTRADA: ",
                            "nome=" + pessoa.getString("nome"));

                    Pessoa objetoPessoa = new Pessoa();
                    objetoPessoa.setNome(pessoa.getString("nome"));
                    objetoPessoa.setCpf(pessoa.getString("CPF"));
                    objetoPessoa.setPws(pessoa.getString("PWS"));
                    pessoas.add(objetoPessoa);
                }

            } catch (JSONException e) {
                Log.e("Erro", "Erro no parsing do JSON", e);
            }
            return pessoas;
        }

ERRO: 08-31 21:11:46.356 20343-20389/com.exemplo.informacoes I/ADRIANO: Resposta do servidor:{ "data": [ { "id": "1234", "name": "Afonso", "pwd": "9845" }, { "id": "asdfadsf54894", "name": "Alana", "pwd": "4812" }, { "id": "6584asdf", "name": "Mancini", "pwd": "4517" }, { "id": "6584asdf", "name": "Oliver", "pwd": "7485" }, { "id": "6584asdf", "name": "Lucas", "pwd": "8459" }, { "id": "6584asdf", "name": "Luzinete", "pwd": "2746" }, { "id": "6584asdf", "name": "Zion", "pwd": "3452" } ]} 08-31 21:11:46.357 20343-20389/com.exemplo.informacoes I/LISTANDO PESSOA:: nome={"data":[{"id":"1234","name":"Afonso","pwd":"9845"},{"id":"asdfadsf54894","name":"Alana","pwd":"4812"},{"id":"6584asdf","name":"Mancini","pwd":"4517"},{"id":"6584asdf","name":"Oliver","pwd":"7485"},{"id":"6584asdf","name":"Lucas","pwd":"8459"},{"id":"6584asdf","name":"Luzinete","pwd":"2746"},{"id":"6584asdf","name":"Zion","pwd":"3452"}]} 08-31 21:11:46.357 20343-20389/com.exemplo.informacoes E/Erro: Erro no parsing do JSON org.json.JSONException: No value for nome at org.json.JSONObject.get(JSONObject.java:389) at org.json.JSONObject.getString(JSONObject.java:550) at com.exemplo.informacoes.ConsumirJsonActivity$DownloadJsonAsyncTask.getPessoas(ConsumirJsonActivity.java:120) at com.exemplo.informacoes.ConsumirJsonActivity$DownloadJsonAsyncTask.doInBackground(ConsumirJsonActivity.java:76) at com.exemplo.informacoes.ConsumirJsonActivity$DownloadJsonAsyncTask.doInBackground(ConsumirJsonActivity.java:52) at android.os.AsyncTask$2.call(AsyncTask.java:295) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) at java.lang.Thread.run(Thread.java:818) 08-31 21:11:46.460 20343-20388/com.exemplo.informacoes E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa3a11310

solução!

Olá Cristiano,

Veja o trecho de código:

objetoPessoa.setNome(pessoa.getString("nome"));
objetoPessoa.setCpf(pessoa.getString("CPF"));
objetoPessoa.setPws(pessoa.getString("PWS"));

Aqui você pede as chaves "nome", "CPF" e "PWS" para o objeto JSON. Mas no seu JSON as chaves são "id", "name" e "pwd". Como ele não encontra as chaves pedidas ele lança uma exceção no momento da leitura. Aqui é trocar para as chaves correspondentes e vai funcionar.

FUNCIONOU! Muito obrigado Jefersson de coração.

                    Log.i("PESSOA ENCONTRADA: ",
                            "nome=" + pessoa.getString("id"));

                    Pessoa objetoPessoa = new Pessoa();
                    objetoPessoa.setId(pessoa.getString("id"));
                    objetoPessoa.setName(pessoa.getString("name"));
                    objetoPessoa.setPws(pessoa.getString("pwd"));
                    pessoas.add(objetoPessoa);