quinta-feira, 24 de julho de 2014

Trabalhando com JSON no Android


O formato JSON além de ser o mais leve para o intercâmbio de dados computacionais, também é suportado pelas bibliotecas nativas do Android.
Para aplicativos que fazem troca de dados online, com certeza esse é o formato mais indicado, pois sua aplicação irá transferir apenas os dados realmente necessários com uma quantidade muito pequena de bytes.
Caso você não conheça o formato JSON, aí vai uma boa referência... http://www.w3schools.com/json/default.asp.
Desenvolvedores que conhecem a linguagem XML sentirão muita facilidade em entender.
Mas vamos fazer um exemplo ?



Passo 1. O conteúdo JSON

{
"employees": [
{ "firstName":"John" , "lastName":"Doe", age:20 },
{ "firstName":"Anna" , "lastName":"Smith", age: 30 },
{ "firstName":"Peter" , "lastName":"Jones", age: 40 }
]
}


Note que na estrutura temos:
- Um array com o nome employees.
- Uma lista de três objetos.
- Propriedades de cada objeto.


Passo 2. Escrevendo uma classe employee

Crie uma classe no seu projeto com o nome Employee e faça a implementação demonstrada.


public class Employee {

private String firstName;
private String lastName;
private int age;

public Employee() {

}

public String getFirstName() {
return firstName;
}

public Employee setFirstName(String firstName) {
this.firstName = firstName;
return this;
}

public String getLastName() {
return lastName;
}

public Employee setLastName(String lastName) {
this.lastName = lastName;
return this;
}

public int getAge() {
return age;
}

public Employee setAge(int age) {
this.age = age;
return this;
}

}

Usamos na implementação dessa classe o padrão Fluent Interface.
Caso não conheça, aí vai uma referência... http://en.wikipedia.org/wiki/Fluent_interface.


Passo 3. Embarcando o conteúdo

Vá no seu projeto em: res/values e abra o arquivo strings.xml.
Abra mais uma tag string (com o nome "employeesjson") e coloque o conteúdo do passo 1 como exemplificado abaixo.


<string name="employeesjson">{
"employees": [
{ "firstName":"John" , "lastName":"Doe", age:20 }, 
{ "firstName":"Anna" , "lastName":"Smith", age: 30 }, 
{ "firstName":"Peter" , "lastName":"Jones", age: 40 }
]
}</string>



Passo 4. Escrevendo uma função que leia o JSON

Na sua Activity faça a implementação da função demonstrada.


private List<Employee> getEmployees() {
     List<Employee> employees = new ArrayList<Employee>();
    
     try{
     String conteudo = getString(R.string.employeesjson);
     JSONArray arrayOfEmployees = new JSONObject(conteudo).getJSONArray("employees");
    
     for (int i=0; i<arrayOfEmployees.length(); i++) {
     JSONObject employeeObject = arrayOfEmployees.getJSONObject(i);
     employees.add(new Employee().setAge(employeeObject.getInt("age"))                                             .setFirstName(employeeObject.getString("firstName"))                     .setLastName(employeeObject.getString("lastName")));
     }
     }catch(Exception e){
     e.printStackTrace();
     }
    
     return employees;
    }


Nessa função retornamos uma lista de employees.
Carregamos o conteúdo do strings.xml através do comando getString e parseamos com o objeto JSONArray para percorrer todos os itens, lendo seus parâmetros e adicionando na lista.
Esse método faz o mapeamento de todo o conteúdo JSON e o transforma em objetos.
Mais uma dica simples e descomplicada de ser feita. 
Ainda vamos fazer outro artigo simplificando todo esse processo mais ainda.

Fiquem de olho e nos vemos na próxima. :)