Para convertir un objeto Java a un String JSON y viceversa existen ya muchas librerias pero hasta ahora no habia encontrado una tan buena y sencilla de utilizar como google-gson. Es increible, donde otras me han fallado porque no podian serializar tipos complejos de datos, google-gson lo ha conseguido y ademas tiene funcionalidades como poder soportar anotaciones de manera que en tiempo de ejecucion podemos cambiar si queremos los nombres de los campos JSON. De fabula!!
Aqui os dejo la documentacion, de todas formas veremos un ejemplo rapido de su aplicacion. No os sorprendais si la clase java os parece un «tanto extraña», es que ahora me estoy inventando un patron nuevo que se llama: «Inyeccion de parametros» ^^
/**
* Clase
*
* Una simple clasecilla para almacenar la estructura de un objeto Java.
*/
package comun.util.json;
import com.google.gson.annotations.*;
import java.util.Collection;
public class Clase {
// El tipo de la clase, p.ej "Java.lang.String"
// Ejemplo del uso de Anotaciones GSON
@SerializedName("tipo_de_la_clase")
public String classname;
// el valor que se almacena si es un tipo simplre como String o integer, p.ej "100"
public String valor;
// la variable que se usa si es un tipo simple, p.ej "saldo"
public String var;
// el tipo de la variable: simple como (String) o complejo (ArrayList, etc)
public String type;
// Si es una clase con un atributo que es otra clase, aqui almacenamos estos
@SerializedName("hijos")
public Collection coleccion;
// identificador para tipos CHOICE
public String idchoice;
// identificador para tipos SEQUENCE
public String idseq;
// el tipo de clase que almacena si es un tipo complejo
public String coleccionType;
}
//end of class Clase.java
Que sera la clase base que usaremos para serializar el objeto. y aqui el ejemplo de serializacion. Primero instanciamos un objeto java compuesto a su vez de otros objetos y lo convertimos a String. Despues hacemos el proceso inverso, leemos el string JSON y a partir de el, componemos un nuevo objeto.
// REFERENCIAS: http://www.json.org/js.html
// GSON: http://sites.google.com/site/gson/gson-user-guide
package comun.util.json;
import com.google.gson.*;
import java.util.Collection;
import java.util.ArrayList;
import java.util.Iterator;
/**
* Para probar el correcto funcionamiento de la clase de ejemplo.
* @author jdelgado
*/
public class Test {
public static void main(String[] args) throws Exception
{
try
{
System.out.println("-- SERIALIZANDO OBJETO a String JSON como: ");
// Instanciar GSON para dejar la salida "bonita" y con soporte de Anotaciones
Gson gson = new GsonBuilder().setPrettyPrinting()
.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE).create();
// Almacenar cadena="ABCDEFG"
Clase c = new Clase();
c.classname="java.lang.String";
c.type = "STRING";
c.valor = "ABCDEFG";
c.var = "cadena";
// Almacenar numero="0123456789"
Clase c2 = new Clase();
c2.classname="java.lang.String";
c2.type = "STRING";
c2.valor = "0123456789";
c2.var = "numero";
// La clase contenedora
Clase complejo = new Clase();
complejo.classname = "java.util.ArrayList";
ArrayList array = new ArrayList(2);
array.add(c);
array.add(c2);
complejo.coleccion = array;
String complex = gson.toJson(complejo);
// Lo serializamos a JSON String
System.out.println("Objeto codificado como :"+complex);
// y ahora el proceso inverso, lo decodificamos
System.out.println("-- DESERIALIZANDO String JSON a OBJETO:");
comun.util.json.Clase leido = new Clase();
leido = gson.fromJson(complex, comun.util.json.Clase.class);
System.out.println("Classname es:"+leido.classname);
int num_hijos = leido.coleccion.size();
System.out.printf("Tiene %s elementos en la coleccion",num_hijos);
System.out.println();
int indice=0;
Iterator ite = leido.coleccion.iterator();
while (ite.hasNext())
{
Clase hijo = (Clase) ite.next();
System.out.println("-> hijo "+indice+" valor: "+hijo.valor);
indice++;
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
//end of class Test.java
Y el resultado de ejecutar todo esto seria:
-- SERIALIZANDO OBJETO a String JSON como:
Objeto codificado como :{"tipo_de_la_clase":"java.util.ArrayList","hijos":[{"tipo_de_la_clase":"java.lang.String",
"Valor":"ABCDEFG","Var":"cadena","Type":"STRING"},{"tipo_de_la_clase":"java.lang.String",
"Valor":"0123456789","Var":"numero","Type":"STRING"}]}
-- DESERIALIZANDO String JSON a OBJETO:
Classname es:java.util.ArrayList
Tiene 2 elementos en la coleccion
-> hijo 0 valor: ABCDEFG
-> hijo 1 valor: 0123456789
Comentarios recientes