«

»

may 10 2012

Mapeando ficheros JSON con Jackson para Android

En un anterior post os comentábamos como parsear un datos JSON ayudándonos de la librería nativa de Android, en esta ocasión lo haremos usando Jackson, una librería que nos permitirá extraer estos datos a objetos Java de manera cómoda y sencilla.

 

Antes que nada y como es costumbre en estos casos nos descargaremos la librería y la incluiremos en el build path de nuestro proyecto Android, pero con la salvedad de que en este caso se divide en tres ficheros jar, Core, Annotations y Databind.

 

Una vez tenemos nuestro proyecto preparado deberemos crear un modelo de datos mediante clases que mapee la estructura de nuestro JSON. Si por ejemplo tuviéramos una estructura JSON como la siguiente:

 

[
	{
		"Country":"Pais1",
		"Region":"Region1",
		"Year":1996,"population":20000
	},
	{
		"Country":"Country2",
		"Region":"Region2",
		"Year":1983,
		"Population":33000
	},
	...
]

 

Tendríamos que crear una clase contenedora del conjunto de datos y otra clase que representara cada elemento:

 

Poblaciones.java

import java.util.ArrayList;

public class Poblaciones extends ArrayList<Rating> {
	// empty
}

 

 Poblacion.java

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

public class Poblacion {
	private String Country;
	private String Region;
	private Integer Year;
	private Integer Value;
}

 

¿Pero como indicamos que atributo de la clase Java se corresponde con que etiqueta de nuestra JSON? Para esto tenemos varias opciones:

 

  • Hacer coincidir nombre de atributos y etiquetas, con esto Jackson automáticamente reconocerá cual es cada uno.
  • Usar anotaciones @JsonProperty para indiciar la relación entre atributos y variables.

 

También tenemos varia alternativa a la hora de controlar la manera en que Jackson interactúa con nuestras clases:

 

  • Dejar los atributos públicos.
  • Atributos privados y definir Getters y Setters.
  • Crear un constructor usando la anotaciones @JsonCreator y @JsonProperty.

 

Ejemplo con Getters, Setters y Anotaciones

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

public class Rating {
	@JsonProperty("Country") private String pais;
	@JsonProperty("Region")	private String region;
	@JsonProperty("Year") private Integer fecha;
	@JsonProperty("Population") private Integer poblacion;
	
	public String getCountry() {
		return Country;
	}

	public void setPais(String pais) {
		this.pais= pais;
	}

	public String getRegion() {
		return region;
	}

	public void setRegion(String region) {
		this.region = Region;
	}

	public Integer getFecha() {
		return fecha;
	}

	public void setFecha(Integer fecha) {
		this.fecha = fecha;
	}

	public Integer gePoblacion() {
		return poblacion;
	}

	public void setPoblacion(Integer poblacion) {
		this.poblacion = poblacion;
	}

}

 

Ejemplo con Constructor y Anotaciones:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

public class Rating {
	private String pais
	private String region;
	private Integer fecha;
	private Integer poblacion;
		
	@JsonCreator
	public Rating(@JsonProperty("Country") String country, @JsonProperty("Region") String region, @JsonProperty("Year") Integer fecha, @JsonProperty("Population") Integer poblacion) {
		super();
		this.country = country;
		this.region = region;
		this.fecha = fecha;
		this.poblacion = poblacion;
	}

	// Los getters serian necesarios para recuperar la información o la implementación o para el proceso inverso (generar JSON)

}

 

Relación entre tipos JSON y tipos Java

 

 

Ya tenemos nuestro modelo montado, ahora solo nos queda darle a Jackson las indicaciones necesarias para que este mapee toda la información contenida en nuestro JSON. De esto se encarga la clase ObjectMapper a la que le pasaremos los datos JSON y la clase que representa el modelo y nos devolverá todos los datos mapeados:

 

ObjectMapper mapper = new ObjectMapper();
Poblaciones arrayData = mapper.readValue(dataJSON, Poblaciones.class);

 

Para generar un JSON sería igualmente sencillo:

 

ObjectMapper mapper = new ObjectMapper();
mapper.writeValueAsString(arrayData);

 

Nota: Tanto para la escritura como lectura disponemos de varios metodos en funcion del tipo de entrada o salida que estemos manejando.

 

Con esto ya tendriamos todos nuestros datos mapeados y bastaría recorrerlos y usarlos de manera trivial en nuestras aplicaciones.

 

Fuente | JacksonInFiveMinutes y adictosaltrabajo.com

Vía | Ingens Blog

 

Acerca del autor

JMPergar

Mobile Developer at @BeRepublic & Founder of @AndroCode. Silver Speaker & Member of Core Team at @GDGBarcelona.

  • https://www.facebook.com/zescrom.morcsez Zescrom Morcsez

    Muy práctico! Gracias!