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 JSON. Por 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.
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.
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;}@Overridepublic 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 {@Overrideprotected 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
| @Overrideprotected 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@Overrideprotected 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@Overrideprotected 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 JSONprivate 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@Overrideprotected 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.
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
Postar um comentário