Manipulando Json no Android



Será que alguém explica nossa relação.... ♪♩♫♭♪♯♬♪♫♩♫♭ ♪♯ 

Faaaaaala galeraaaaaaaaaaaa! Estamos aqui para mais um post ao lado de vocês. Hoje vamos focar em javaDroid (Android), Vamos ensinar como manipular dados json no nosso app.

Lets Rock :p

Atualmente 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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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.
1
2
3
4
5
6
7
8
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.
1
2
3
4
5
6
7
8
9
10
@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.
1
2
3
4
5
6
7
//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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//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.
1
2
3
</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

Até a próxima !

Comentários

Postagens mais visitadas deste blog

E Esse Tal de Nano Service?

Executar Audio em Java Swing

Validando Email em Java Com e Sem expressão Regular