Social

sábado, 27 de abril de 2013

Java: Leer/Escribir Json con Gson

Gson es un parser que nos permite leer cadenas obtenidas de archivos Json hecho para Java que fue realizado por Google. A diferencia de otros parsers detecta la estructura del .json y nos permite asignarle estos valores aun Objeto definido por nosotros si las estructuras coinciden, en otras palabras nos permiten parsear objetos json a objetos java.

Se puede descargar la librería Gson de code.google.com o directamente de este link <-click.

En este caso se usará la clase Hijo para definir la estructura que tendrá el json. Hijo es un pojo sencillo como se ve a continuación:

public class Hijo {
private String nombre;
private String apellido;
private int edad;
private Hijo hijo;
public Hijo() {
}
public Hijo getHijo() {
return hijo;
}
public void setHijo(Hijo hijo) {
this.hijo = hijo;
}
public int getEdad() {
return edad;
}
public void setEdad(int edad) {
this.edad = edad;
}
public Hijo(String nombre, String apellido) {
this.nombre = nombre;
this.apellido = apellido;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getApellido() {
return apellido;
}
public void setApellido(String apellido) {
this.apellido = apellido;
}
}
view raw Hijo.java hosted with ❤ by GitHub
El siguiente código muestra como leer una cadena json haciendo uso de la librería gson y sus métodos, para instanciar un objeto Hijo con sus datos según el json:

import com.google.gson.Gson;
public class GsonSimpleRead {
public GsonSimpleRead() {
String json = "{\"nombre\":\"Juan\","
+ "\"apellido\":\"Carabela\","
+ "\"edad\":45, "
+ "\"hijo\":{"
+ "\"nombre\":\"Pepe\","
+ "\"apellido\":\"Carabela\","
+ "\"edad\":21,"
+ " \"hijo\":null"
+ "}"
+ "}";
Gson gson = new Gson();
Hijo hijo = gson.fromJson(json, Hijo.class);
System.out.println(hijo.getEdad());
System.out.println(hijo.getHijo().getNombre());
}
public static void main(String[] args) {
GsonSimpleRead gson = new GsonSimpleRead();
}
}

Este código da como resultado lo siguiente:

  45
  Pepe

Por otro lado si se desea escribir una cadena json en base a un objeto, en este caso Hijo, simplemente se debe utilizar el siguiente código:

import com.google.gson.Gson;
public class GsonSimpleWrite {
public GsonSimpleWrite() {
Hijo hijo = new Hijo();
hijo.setNombre("Juan");
hijo.setApellido("Carabela");
hijo.setEdad(46);
Hijo hijo2 = new Hijo();
hijo2.setNombre("Rambo");
hijo2.setApellido("Carabela");
hijo2.setEdad(21);
hijo2.setHijo(null);
hijo.setHijo(hijo2);
Gson gson = new Gson();
String json = gson.toJson(hijo);
System.out.println(json);
}
public static void main(String[] args) {
GsonSimpleWrite gson = new GsonSimpleWrite();
}
}

El código anterior da como resultado la siguiente salida en consola:

{
   "nombre":"Juan",
   "apellido":"Carabela",
   "edad":46,
   "hijo":{
      "nombre":"Rambo",
      "apellido":"Carabela",
      "edad":21
   }
}

4 comentarios :

  1. Hola me gustaria saber como leer el ultimo ejemplo, gracias.

    ResponderEliminar
    Respuestas
    1. Se te refieres al json despleagado al final, basta con tomar ese String y crear un nuevo hijo:
      Hijo hijo = gson.fromJson(json, Hijo.class);
      Toma en cuenta que para incluir en un String las comillas (") en java debes agregarle un slash invertido de la siguienter forma \".
      Saludos.

      Eliminar
  2. hola, como se convertiria a objetos esto:

    [{"estadoacademicoSimple":[{"legajo":"1231","estadoAcademico":"regular","carreraSimple":{"nombre":"sistemas"},"fechaIngreso":"Mar 30, 2008 12:00:00 AM","fechaBaja":"Nov 30, 2013 12:00:00 AM"},{"legajo":"1233","estadoAcademico":"libre","carreraSimple":{"nombre":"quimica"},"fechaIngreso":"Jul 30, 2008 12:00:00 AM","fechaBaja":"Nov 30, 2013 12:00:00 AM"}]}]


    Tengo entendido que al ser una lista de estados academicos debo definir un tipo con type, y ademas un array de los estados.
    Saludos y gracias

    ResponderEliminar
    Respuestas
    1. Hola, al ser un array que puede ser de cualquier tipo tienes que definir un tipo como te muestro a continuación.
      Type type = new TypeToken>(){}.getType();

      El objeto quedaría como:
      class EstadosAcademicos{
      List estadoacademicoSimple;
      }

      class EstadoAcademicoSimple{
      String legajo;
      String estadoAcademico;
      CarreraSimple carreraSimple;
      Date fechaIngreso;
      Date fechaBaja;
      }

      class CarreraSimple{
      String nombre;
      }

      No es exactamente esa pero debería darte una idea.

      Saludos.

      Eliminar