martes, 30 de octubre de 2012

Cómo usar JSON con Java

JSON (JavaScript Object Notation) es un formato sencillo utilizado para el intercambio de datos. Es completamente independiente del lenguaje y una buena alternativa para quienes no gustan del XML. En este post les voy a mostrar la manera de cómo utilizar este popular formato para aplicaciones Java. Si bien es cierto que existen muchas implementaciones, en este post voy a usar la que, a mi parecer, es la más ligera, clara y accesible manera de utilizar JSON en aplicaciones Java. Existe una implementación hecha por Google muy buena pero si queremos utilizarla con applets por ejemplo, vamos a tener problemas.

Bien, lo primero que necesitamos es descargarnos 5 clases: JSONArray, JSONException, JSONObject, JSONString y JSONTokener de json.org y agregarlas a nuestro proyecto de Java de tal manera que nos quede así:
Fig. 1 Árbol de clases del paquete JSON
Hecho esto, podemos crear un bean por ejemplo al que le agregaremos algunos atributos. Este bean podría ser una entidad que haga referencia a una tabla de base de datos por ejemplo. Para este ejemplo vamos a crear un bean Vendedor y un bean Cliente tal como se muestra a continuación:

Creamos la clase Vendedor.
package com.demo.bean;

import java.util.List;

/**
 *
 * @author Rolando
 */
public class Vendedor {

    private int edad;
    private String nombre;
    private String apellido;
    private List<Cliente> clientes;

    public String getApellido() {
        return apellido;
    }

    public void setApellido(String apellido) {
        this.apellido = apellido;
    }

    public List<Cliente> getClientes() {
        return clientes;
    }

    public void setClientes(List<Cliente> clientes) {
        this.clientes = clientes;
    }

    public int getEdad() {
        return edad;
    }

    public void setEdad(int edad) {
        this.edad = edad;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
}
Y ahora la clase Cliente:
package com.demo.bean;

/**
 *
 * @author Rolando
 */
public class Cliente {

    private String dirección;
    private String nombre;
    private String telefono;

    public String getDirección() {
        return dirección;
    }

    public void setDirección(String dirección) {
        this.dirección = dirección;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getTelefono() {
        return telefono;
    }

    public void setTelefono(String telefono) {
        this.telefono = telefono;
    }
}
Ahora creamos nuestro método principal en donde instanciamos un objeto Vendedor al que se le asocia dos clientes y creamos el objeto JSON a partir de ello.
public static void main(String[] args) {
    Vendedor v1 = new Vendedor();
    v1.setNombre("Juan");
    v1.setApellido("Perez");
    v1.setEdad(10);
    Cliente c1 = new Cliente();
    c1.setNombre("HIVYMAR");
    c1.setDirección("Victor Emilio Estrada 204");
    c1.setTelefono("5020800");
    Cliente c2 = new Cliente();
    c2.setNombre("PROMESA");
    c2.setDirección("Via. Daule KM 5.5");
    c2.setTelefono("5013604");
    List<Cliente> clientes = new ArrayList<Cliente>();
    clientes.add(c1);
    clientes.add(c2);
    v1.setClientes(clientes);
    //CREAMOS EL OBJETO JSON
    JSONObject obj = new JSONObject(v1);
    System.out.println(obj);
}
Al imprimir en consola el resultado podremos ver en la Fig. 2 que no es lo que esperabamos.
Fig 2. Objeto JSON simple
Para eso justamente utilizamos otra de las clases que nos hemos descargado: JSONArray. Para mostrar el funcionamiento de esta clase voy a implementar un segundo métood main, de tal manera que podamos reflejar a través de un objeto JSON a nuestro objeto Vendedor con sus respectivos clientes.
public static void main(String[] args) {
    Vendedor v1 = new Vendedor();
    v1.setNombre("Juan");
    v1.setApellido("Perez");
    v1.setEdad(10);
    Cliente c1 = new Cliente();
    c1.setNombre("HIVYMAR");
    c1.setDirección("Victor Emilio Estrada 204");
    c1.setTelefono("5020800");
    Cliente c2 = new Cliente();
    c2.setNombre("PROMESA");
    c2.setDirección("Via. Daule KM 5.5");
    c2.setTelefono("5013604");
    List<Cliente> clientes = new ArrayList<Cliente>();
    clientes.add(c1);
    clientes.add(c2);
    //CREAMOS EL OBJETO JSON
    JSONObject objVendedor = new JSONObject(v1);
    JSONArray objClientes = new JSONArray();
    try {
        for (Cliente cliente : clientes) {
            JSONObject objCliente = new JSONObject();
            objCliente.put("nombre", cliente.getNombre());
            objCliente.put("direccion", cliente.getDirección());
            objCliente.put("telefono", cliente.getTelefono());
            objClientes.put(objCliente);
        }
        JSONObject objVendedorClientes = new JSONObject();
        objVendedorClientes.put("vendedor", objVendedor);
        objVendedorClientes.put("clientes", objClientes);
        System.out.println(objVendedorClientes);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
El resultado mostrado en la Fig. 3 refleja de mejor manera lo que realmente queremos representar y a su vez, este objeto puede ser interpretado por cualquier lenguaje de programación.

Fig. 3. Resultado de la generación de ub objeto JSON que contiene listas como elementos.
Bueno, espero haber sido claro a  lo largo de este post. Nos vemos hasta una próxima oportunidad. Y no dejen de enviar sus comentarios a la página de Facebook de este Blog.

Hasta una próxima oportunidad.

5 comentarios:

  1. Interesante aporte amigo, tambien esta la libreria JSONSIMPLE donde se encuentran todas esas clases de JSON :) Gran aporte, Suerte

    ResponderEliminar
  2. Claro, existen muchas implementación. Gracias por el aporte amigo Roliver.
    Saludos.

    ResponderEliminar
  3. Rolando un excelente aporte ,,, disculpa te quiero hacer una consulta , ojala pudieras ayudarme.. mira como puedo generar un JSON que contenga los resultados de un query que ha sido ejecutado dentro de una clase java con un resultSet.

    Saludos!!

    ResponderEliminar
  4. Lo que tendrías que hacer es almacenar tu resulSet en una lista de de objetos que pueda representar a la tabla que resulta de tu consulta, donde cada registro es un objeto y cada campo de la tabla es un atributo del mismo. Luego de eso creas un JSONArray tal como muestro en este ejemplo.

    ResponderEliminar
  5. public ExamenFisicoPediatrico toExamenFisicoPediatrico(String json) {
    try {
    JSONParser jsonParser = new JSONParser();
    JSONObject jsonObject = (JSONObject) jsonParser.parse(json);
    descripcionGeneral = (String) jsonObject.get("descripcionGeneral");
    tensionArterial = (Double) jsonObject.get("tensionArterial");
    peso = (Double) jsonObject.get("peso");
    talla = (Double) jsonObject.get("talla");
    perimetroCefalico = (Double) jsonObject.get("perimetroCefalico");
    perimetroToraxico = (Double) jsonObject.get("perimetroToraxico");
    frecuenciaRespiratoria = (Integer) jsonObject.get("FrecuenciaRespiratoria");
    frecuenciaCardiaca = (Integer) jsonObject.get("FreceunciaCardiaca");
    temperatura = (Double) jsonObject.get("temperatura");

    Double name = (Double) jsonObject.get(peso);
    System.out.println(name);
    } catch (ParseException ex) {
    Logger.getLogger(ExamenFisicoPediatrico.class
    .getName()).log(Level.SEVERE, null, ex);
    }

    return this;
    }

    public String toJson() {
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("descripcionGeneral", descripcionGeneral);
    jsonObject.put("tensionArterial", tensionArterial);
    jsonObject.put("peso", peso);
    jsonObject.put("talla", talla);
    jsonObject.put("perimetroCefalico", perimetroCefalico);
    jsonObject.put("perimetroToraxico", perimetroToraxico);
    jsonObject.put("frecuenciaRespiratoria", frecuenciaRespiratoria);
    jsonObject.put("frecuenciaCardiaca", frecuenciaCardiaca);
    jsonObject.put("temperatura", temperatura);
    return jsonObject.toString();

    }

    public ExamenFisicoPediatrico toPeso(String json) {

    try {
    JSONParser jsonParser = new JSONParser();
    JSONObject jsonObject = (JSONObject) jsonParser.parse(json);
    Object obj = jsonParser.parse(json);
    descripcionGeneral = (String) jsonObject.get("descripcionGeneral");
    tensionArterial = (Double) jsonObject.get("tensionArterial");
    peso = (Double) jsonObject.get("peso");
    talla = (Double) jsonObject.get("talla");
    perimetroCefalico = (Double) jsonObject.get("perimetroCefalico");
    perimetroToraxico = (Double) jsonObject.get("perimetroToraxico");
    frecuenciaRespiratoria = (Integer) jsonObject.get("FrecuenciaRespiratoria");
    frecuenciaCardiaca = (Integer) jsonObject.get("FreceunciaCardiaca");
    temperatura = (Double) jsonObject.get("temperatura");

    json = ("peso");
    obj = jsonParser.parse(json);
    System.out.println(obj);

    } catch (ParseException e) {
    Logger.getLogger(ExamenFisicoPediatrico.class
    .getName()).log(Level.SEVERE, null, e);
    }

    return toPeso(json);

    }

    ResponderEliminar