Java y Json :)

Le puse una carita feliz porque nunca fue más fácil transformar de Objetos Java a Json y alverre.

La magia en realidad la hace la librería de Google llamada Gson. Obviamente, necesitamos descargarla (yo descargué las fuentes, el .jar y el javadoc) y agregarla a nuestro proyecto.

Ok, primero vamos con el Objecto a Json.

Digamos que tenemos las siguientes clases:

public class Factura {
    @Id private ObjectId Id;
    @Indexed(unique=true) private String KeyFactura;
    private String Proveedor,
            Fecha;
    private int Factura,
            Orden;
    @Embedded private List<DetalleFactura> Detalle;
}
class DetalleFactura {

    private String Producto;
    private Integer Unidades,
            Precio;
}

Si se fijan estoy ocupando Morphia para MongoDB (aunque para el post no es relevante), además, la clase Factura tiene dentro una lista de la clase DetalleFactura.

Si queremos que nuestra clase Factura se convierta en Json por arte de magia, agregamos una nueva función a la clase que devuelva un String.

public String Gson(){
    Gson gson = new GsonBuilder().setPrettyPrinting().create();
    return gson.toJson(this);
}

Y con esto ya estamos listos🙂 Ahora es cosa de un Factura.Gson() {aunque no sea static😯 } y tenemos la salida

{
  "Proveedor": "3.698.951",
  "Fecha": "29-02-2012",
  "Factura": 10,
  "Orden": 20,
  "Detalle": [
    {
      "Producto": "505bd30abf94e8990fc6fcd5",
      "Unidades": 20,
      "Precio": 30000
    },
    {
      "Producto": "5053dbe98daa5eaa5cdc6cad",
      "Unidades": 50,
      "Precio": 4000
    }
  ]
}

Si se fijan, no aparecen algunos campos. Esto es porque cuando creé el objeto, algunas variables quedaron nulas. En ese caso, simplemente no aparecen. Si se instanciaran, aparecerían con su valor (null, “”, 0, etc).

Ahora vamos a la inversa. Supongamos que le hicimos un JSON.stringify(Factura) a determinado objecto en Json y lo enviamos al servlet en un parámetro (o en escritorio, etc), y tenemos el mismo modelo que el json anterior (en que usamos en el ejemplo).

Lo único que debemos hacer es

Gson gson = new Gson();
Factura F = gson.fromJson(json, Factura.class);

Donde “json” es la variable que contiene todo el json (dah). Obviamente, las variables en el string json deben llamarse iguales a la de la clase. Si no es así, o la variable no se encuentra, simplemente quedan como null o no instanciadas.

Acerca de MaritoCares

Ingeniero Informático. Con tendencias a la programación en [C#, VB].NET, Java(Web principalmente...), PHP, JavaScript, algo mínimo de [ruby, python], y el clásico C.
Esta entrada fue publicada en Java, JavaScript, Tutoriales. Guarda el enlace permanente.

3 respuestas a Java y Json :)

  1. diego dijo:

    Hola me podrias echar una manito con eso por favor, necesito hacer pasar este private con web service a JSON, no e podido encontrar la manera de hacerlo.
    muchas gracias.

    Private Sub btnCarga_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCarga.Click
    If Not fn.Errors(“¿Está seguro de Cargar todos los Maestros?. Esta acción puede demorar.”, 2) Then Exit Sub
    lblCaptionCarga.Text = “”
    ProgressBar.Visible = True
    ProgressBar.Minimum = 1
    ProgressBar.Value = 1
    Application.DoEvents()

    Dim foliosSAP As String = “”
    Dim indexTablas As Integer = 0
    Dim existe As Integer = 0

    btnCarga.Enabled = False
    btnSalir.Enabled = False
    ‘Try

    foliosSAP = servicios.getGuiasSAP_Puerto(“TL10”, “TL10”)
    If Len(foliosSAP.Trim()) > 0 Then
    Dim result As String() = foliosSAP.Split(New Char() {“;”})
    Dim nFolioIni, nFolioFin As Integer
    Dim nLote, sSql As String

    nLote = result(0).ToString()
    nFolioIni = Integer.Parse(result(1).ToString())
    nFolioFin = Integer.Parse(result(2).ToString())

    ProgressBar.Minimum = 1
    ProgressBar.Value = 1
    ProgressBar.Maximum = (CInt(nFolioFin) – CInt(nFolioIni))
    lblCaptionCarga.Text = getMsg(0, “Folios de Guias Puerto San Antonio”)
    For x = CInt(nFolioIni) To CInt(nFolioFin)
    sSql = “”
    existe = 0
    existe = GetScalar_OleDb(“SELECT COUNT(*) AS CANTIDAD FROM DAT_GUIASENPUERTO_DETALLE WHERE nIdGuia = ‘” & nLote & “‘ and folioGuia='” & x & “‘”)

    If existe = 0 Then
    sSql = “INSERT INTO DAT_GUIASENPUERTO_DETALLE(nIdGuia,folioGuia,codEstGuia,nomEstGuia,fechaGuia) VALUES(‘” & nLote & “‘,'” & x & “‘,0,’ENTREGADA’,null)”
    Ejecuta_Comando_OleDB(sSql)
    End If

    ProgressBar.PerformStep()
    Application.DoEvents()
    Next
    End If

    foliosSAP = servicios.getGuiasSAP_Puerto(“TL10”, “TL11”)

    If Len(foliosSAP.Trim()) > 0 Then
    Dim result As String() = foliosSAP.Split(New Char() {“;”})
    Dim nFolioIni, nFolioFin As Integer
    Dim nLote, sSql As String
    nLote = result(0).ToString()
    nFolioIni = Integer.Parse(result(1).ToString())
    nFolioFin = Integer.Parse(result(2).ToString())

    ProgressBar.Minimum = 1
    ProgressBar.Value = 1
    ProgressBar.Maximum = (CInt(nFolioFin) – CInt(nFolioIni))
    lblCaptionCarga.Text = getMsg(0, “Folios de Guias Puerto Valparaiso”)
    For x = CInt(nFolioIni) To CInt(nFolioFin)
    sSql = “”

    existe = 0
    existe = GetScalar_OleDb(“SELECT COUNT(*) AS CANTIDAD FROM DAT_GUIASENPUERTO_DETALLE WHERE nIdGuia = ‘” & nLote & “‘ and folioGuia='” & x & “‘”)

    If existe = 0 Then
    sSql = “INSERT INTO DAT_GUIASENPUERTO_DETALLE(nIdGuia,folioGuia,codEstGuia,nomEstGuia,fechaGuia) VALUES(‘” & nLote & “‘,'” & x & “‘,0,’ENTREGADA’,null)”
    Ejecuta_Comando_OleDB(sSql)
    End If

    ProgressBar.PerformStep()
    Application.DoEvents()
    Next
    End If
    ‘Catch ex As Exception

    ‘End Try

    For i As Integer = 0 To tablasArr.Length – 1
    If fn.IsOffline() Then
    arregloText = New ArrayList(servicios.getArreglo(rutaCon, tablasArr(i)))
    Else
    arregloText = arreglo(tablasArr(i))
    End If

    ProgressBar.Minimum = 1
    ProgressBar.Value = 1
    ProgressBar.Maximum = arregloText.Count

    lblCaptionCarga.Text = getMsg(0, tablasAcces(i))
    query = “DELETE FROM ” & tablasArr(i)
    Ejecuta_Comando_OleDB(query)

    For Each sLine In arregloText

    Console.WriteLine(sLine)
    Dim arInterno = Split(sLine, “;”)
    Select Case UCase(tablasArr(i))
    Case “DAT_CAMION”
    query = getQuery(i) & fn.Cl(arInterno(0)) & “,” & fn.Cl(arInterno(1)) & “)”
    Case “DAT_CIUDAD”
    query = getQuery(i) & fn.Cl(arInterno(0)) & “,” & fn.Cl(arInterno(1)) & “,” & fn.Cl(arInterno(2)) & “)”
    Case “DAT_CLIENTES”
    query = getQuery(i) & fn.Cl(arInterno(0)) & “,” & _
    fn.Cl(arInterno(1)) & “,” & _
    fn.Cl(arInterno(2)) & “,” & _
    fn.Cl(arInterno(3)) & “,” & _
    fn.Cl(arInterno(4)) & “,” & _
    fn.Cl(arInterno(5)) & “,” & _
    fn.Cl(arInterno(6)) & “,” & _
    fn.Cl(arInterno(7)) & “,” & _
    fn.Cl(arInterno(8)) & “,” & _
    fn.Cl(arInterno(9)) & “)”
    Case “DAT_CLIENTE_CONSIGNA_9RUTAS”
    query = getQuery(i) & fn.Cl(arInterno(0)) & “,” & _
    fn.Cl(arInterno(1)) & “,” & _
    fn.Cl(arInterno(2)) & “,” & _
    fn.Cl(arInterno(3)) & “,” & _
    fn.Cl(arInterno(4)) & “,” & _
    fn.Cl(arInterno(5)) & “,” & _
    fn.Cl(arInterno(6)) & “,” & _
    fn.Cl(arInterno(7)) & “,” & _
    fn.Cl(arInterno(8)) & “,” & _
    “0,” & _
    “0)”
    ‘arInterno(9) & “,” & _
    ‘arInterno(10) & “)”
    Case “DAT_COMUNA”
    query = getQuery(i) & fn.Cl(arInterno(0)) & “,” & fn.Cl(arInterno(1)) & “,” & fn.Cl(arInterno(2)) & “)”
    Case “DAT_CONDUCTOR”
    query = getQuery(i) & fn.Cl(arInterno(0)) & “,” & _
    fn.Cl(arInterno(1)) & “,” & _
    fn.Cl(arInterno(2)) & “, ” & _
    fn.Cl(arInterno(3)) & “)”
    Case “DAT_CONSIGNATARIO”
    query = getQuery(i) & fn.Cl(arInterno(0)) & “,” & _
    fn.Cl(arInterno(1)) & “,” & _
    fn.Cl(arInterno(2)) & “,” & _
    fn.Cl(arInterno(3)) & “,” & _
    fn.Cl(arInterno(4)) & “,” & _
    fn.Cl(arInterno(5)) & “,” & _
    fn.Cl(arInterno(6)) & “,” & _
    fn.Cl(arInterno(7)) & “,” & _
    fn.Cl(arInterno(8)) & “,” & _
    fn.Cl(arInterno(9)) & “)”
    Case “DAT_ESTADOGUIA”
    query = getQuery(i) & arInterno(0) & “,” & _
    fn.Cl(arInterno(1)) & “)”
    Case “DAT_REGION”
    query = getQuery(i) & fn.Cl(arInterno(0)) & “,” & fn.Cl(arInterno(1)) & “,1)”
    Case “DAT_REMOLQUE”
    query = getQuery(i) & fn.Cl(arInterno(0)) & “,” & _
    fn.Cl(arInterno(1)) & “)”
    Case “DAT_RUTAS”
    query = getQuery(i) & fn.Cl(arInterno(0)) & “,” & _
    fn.Cl(arInterno(1)) & “,” & _
    fn.Cl(arInterno(2)) & “)”
    End Select
    Ejecuta_Comando_OleDB(query)

    ProgressBar.PerformStep()
    Application.DoEvents()
    Next
    Next
    Application.DoEvents()
    fn.Errors(“Actualización exitosa.”, 1)
    Close()
    End Sub

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s