Receber dados via JSON em um aplicativo Android

androidJson-400x200Atualmente muitos sistemas são alimentados utilizando serviços que retornam um JSONPor que não criar aplicativos Android que também possam consumir informações via JSON? O objetivo deste post é mostrar como é fácil um aplicativo acessar e exibir informação através deste mecanismo.

O primeiro passo é ter acesso a um serviço, para exemplificar o post, utilizei um serviço local, ilustrado na Figura 1, que gera um JSON com alguns dados como nome e CPF. A ideia do aplicativo, é que assim que a aplicação for iniciada, ela carregue uma lista com o nome de todas as pessoas informadas via JSON e ao clicar no nome seja exibido o nome e CPF em outra tela.

json

Figura 1 – Dados retornados via JSON

Para quem quiser conhecer um pouco mais como criar serviços que retornem esse tipo de estrutura, podem ler o post Webservices usando JAX-RS 2 e Spring.

Depois de vermos a estrutura do serviço JSON, o próximo passo é criar o projeto Android. Criei um projeto Android conforme ilustrado na Figura 2.

projeto

Figura 2 – Estrutura do projeto Android

Na Listagem 1, temos classe “Pessoa” é o nosso POJO que representará os dados recebidos.

public class Pessoa implements Serializable {

/**
* POJO
*/
private static final long serialVersionUID = 1L;
private String nome;
private String cpf;

public String getNome() {
return nome;
}

public void setNome(String nome) {
this.nome = nome;
}

public String getCpf() {
return cpf;
}

public void setCpf(String cpf) {
this.cpf = cpf;
}

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

}
Listagem 1 – Classe Pessoa

O próximo passo é criar a classe “ConsumirJsonActivity”, representada na Listagem 2, que é a responsável por acessar o serviço JSON e criar os objetos com as informações recebidas.

No exemplo estendo a classe “ListActivity” para que assim que o aplicativo for iniciado ele já crie uma lista com os dados.

No método “onCreate” é chamado a classe “DownloadJsonAsyncTask” passando como parâmetro o link de acesso ao serviço.

public class ConsumirJsonActivity extends ListActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new DownloadJsonAsyncTask()
.execute("http://10.0.5.180:8080/samples/mock_pessoas");
}
Listagem 2 – Método que chama a URL do serviço

O método “onListItemClick”, na Listagem 3, é o responsável por enviar as informações do nome selecionado na lista para a activity “InformacoesActivity” que exibirá os dados em outra tela.

@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);
}
Listagem 3 – Método responsável por enviar os dados selecionados para outra activity

A classe “DownloadJsonAsyncTask” é responsável por fazer o processamento dos dados. Ela herda alguns métodos da classe “AsyncTask” que vamos ver mais adiante.

O primeiro método relevante desta classe é o “onPreExecute”, mostrado na Listagem 4, ele é responsável por exibir uma mensagem de feedback enquanto é feito o download das informações.

//Exibe pop-up indicando que está sendo feito o download do JSON
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog = ProgressDialog.show(ConsumirJsonActivity.this, "Aguarde",
"Fazendo download do JSON");
}
Listagem 4 – Método que indica para o usuário que o aplicativo está fazendo o download do JSON

Em paralelo a ela é executado o método “doInBackground”, representado na Listagem 5, é neste método que efetivamente fazemos o download do JSON. Por parâmetro é passado para esse método a URL do serviço. Ela é acessada a partir das classes responsáveis por fazer conexões HTTP.

Notem que na linha 14 é chamado o método “getPessoas(json)”, ele que retornará os objetos preenchidos com as informações, sua codificação está na Listagem 6.

//Acessa o serviço 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;
}
Listagem 5 – Método que acessa o serviço

Como dito a cima, este método “getPessoas” retoma uma lista de pessoas.

O parâmetro que ele recebe é a string JSON retornada pelo serviço.

Primeiro se cria um objeto “JSONArray” passando a string recebida. Esse objeto é como se fosse um array, cada parte do JSON se transforma em uma posição.

Depois o array é percorrido e para cada posição é criado um objeto “JSONObject”.

Utilizando esse objeto é setado os atributos do objeto “Pessoa” passando a chave definida no JSON para obter o valor.

//Retorna uma lista de pessoas com as informações 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"));
pessoas.add(objetoPessoa);
}

} catch (JSONException e) {
Log.e("Erro", "Erro no parsing do JSON", e);
}
return pessoas;
}
Listagem 6 – Método que retorna a lista de pessoas com os atributos preenchidos com as informações do JSON

A próxima etapa é exibir os objetos preenchidos em uma lista. Na Listagem 7, temos o método “onPostExecute”, responsável por realizar esta ação. Este método sempre é executado depois de feito o download. Se o download ocorrer corretamente é criado um adapter para exibir os objetos em uma lista.

Caso haja algum problema durante o acesso ao serviço é exibida uma mensagem informando que não foi possível acessar as informações.

//Depois de executada a chamada do serviço
@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("Não foi possível acessar as informações!!")
.setPositiveButton("OK", null);
builder.create().show();
}
}
Listagem 7 – Método chamado depois que o download é concluído

Também é necessário alterar o arquivo “AndroidManifest.xml”. Nele é preciso acrescentar a permissão de acesso a Internet, como mostrado na Listagem 8, fazendo com que a aplicação consiga acessar o serviço JSON.

</pre>
<uses-permission android:name="android.permission.INTERNET"/>
<pre>
Listagem 8 – Permissão para aplicativo acessar a Internet

Pronto!! Com algumas linhas de código é possível criar um aplicativo simples que é populado com dados enviados via serviço JSON.

O projeto utilizado como exemplo está disponível aqui.

Na Figura 3 há um exemplo de como ficou o aplicativo.

 app

Figura 3 – Lista de nomes recebidos via JSON

Referências 

[1] http://www.devmedia.com.br/consumindo-json-em-aplicacoes-android/27589

[2] http://www.vogella.com/tutorials/AndroidJSON/article.html

Links Externos

[1] http://www.json.org/json-pt.html

[2] Webservices usando JAX-RS 2 e Spring

[3] https://sourceforge.net/projects/jsoninformacoes/files/latest/download?source=files

Por MONISE COSTA

Formada em Sistemas de Informação pela PUC Campinas, MATERANA desde 2011. Apaixonada pela área de TI, Analista de Requisitos na maior parte do tempo e desenvolvedora Java/Android por lazer.

Postado em: 05 de junho de 2014

Confira outros artigos do nosso blog

[Webinar] Profile de aplicações Java com Oracle Mission Control e Flight Recorder

24 de julho de 2017

Danival Calegari

Criando Mocks de serviços REST com SoapUI

27 de junho de 2017

Monise Costa

Three laws that enable agile software development

09 de março de 2017

Celso Gonçalves Junior

Medindo performance de uma API REST

21 de fevereiro de 2017

Monise Costa

Deixe seu comentário