[ASP.NET] Serializando un consulta LINQ a JSON

Posted on Actualizado enn


Hola a todos, actualmente creo que todos hemos escuchado sobre el formato JSON (JavaScript Object Notation) y su excelente trabajo en conjunto con AJAX, y debido a su gran popularidad los desarrolladores de .NET ya tenemos un namespace que nos permiten trabajar con este tipo de formato.

En este post quiero mostrar como podemos tener el resultado de una consulta LINQ y persistirlo a un archivo de texto en formato JSON.

En primer lugar vamos a definir una clase, la cual será la entidad que vamos a convertir a JSON, la clase tendra la información básica de un cliente, y solo vamos a manejar 4 atributos:

 1: Public Class Cliente
 2: 
 3:     Public Property Codigo As Integer
 4:     Public Property Nombre As String
 5:     Public Property Email As String
 6:     Public Property Ciudad As String
 7:  
 8: End Class

Primero que todo vamos a mostrar una lista de Clientes en un control GridView, entonces definidos el HTML para el GridView y adicionalmente creamos un botón que nos exportara los datos a el archivo de texto, la creación de este HTML no la coloco puesto que es realmente muy sencilla, pero la idea es una vez carguemos datos visualizar algo así:

Imagen1

Ahora iniciemos con el código, lo primero que vamos a tener es una función la cual va a retornar una lista de clientes:

 1: Private Function ObtenerClientes() As List(Of Cliente)
 2:     Dim clientes As List(Of Cliente) = New List(Of Cliente) From {
 3:         New Cliente With {.Codigo = 1, .Nombre = "Empleado 1", .Email = "empleado1@hotmail.com", .Ciudad = "Bogota"},
 4:         New Cliente With {.Codigo = 2, .Nombre = "Empleado 2", .Email = "empleado2@hotmail.com", .Ciudad = "Bogota"},
 5:         New Cliente With {.Codigo = 3, .Nombre = "Empleado 3", .Email = "empleado3@hotmail.com", .Ciudad = "Bogota"},
 6:         New Cliente With {.Codigo = 4, .Nombre = "Empleado 4", .Email = "empleado4@hotmail.com", .Ciudad = "Cali"},
 7:         New Cliente With {.Codigo = 5, .Nombre = "Empleado 5", .Email = "empleado5@hotmail.com", .Ciudad = "Cali"},
 8:         New Cliente With {.Codigo = 6, .Nombre = "Empleado 6", .Email = "empleado6@hotmail.com", .Ciudad = "Medellin"},
 9:         New Cliente With {.Codigo = 7, .Nombre = "Empleado 7", .Email = "empleado7@hotmail.com", .Ciudad = "Medellin"},
 10:         New Cliente With {.Codigo = 8, .Nombre = "Empleado 8", .Email = "empleado8@hotmail.com", .Ciudad = "Medellin"}
 11:     }
 12:     Return clientes
 13: End Function

Luego para cargar el GridView solo el asignamos como fuente de datos la lista que retorna la función creada anteriormente:

 1: Private Sub CargarClientes()
 2:     grvClientes.DataSource = ObtenerClientes()
 3:     grvClientes.DataBind()
 4: End Sub

Ahora viene lo interesante, vamos a persistir la lista de clientes a un archivo de texto, en este caso vamos a agregar una referencia la namespace System.Runtime.Serialization, e importamos System.IO y System.Runtime.Serialization.Json:

 1: Imports System.Runtime.Serialization.Json
 2: Imports System.IO

Luego en el evento click del botón tenemos:

 1: Protected Sub btnJson_Click(sender As Object, e As EventArgs) Handles btnJson.Click
 2:     Dim clientes As List(Of Cliente) = ObtenerClientes()
 3:  
 4:     Dim query As IEnumerable(Of Cliente) = (From c In clientes
 5:                                             Select c).ToList()
 6: 
 7:     Dim serializer As DataContractJsonSerializer = New DataContractJsonSerializer(GetType(IEnumerable(Of Cliente)))
 8:     Dim file As FileStream = New FileStream("c:/clientes.json", FileMode.Create)
 9:  
 10:     serializer.WriteObject(file, query)
 11:     file.Close()
 12:     file.Dispose()
 13: End Sub

Primero definimos una lista de clientes, luego realizamos una consulta a esa lista de clientes utilizando LINQ, para este ejemplo se van a seleccionar todos los datos, por lo tanto no se ha utilizando ninguna condición de filtro, luego creamos un objeto de tipo DataContractJsonSerializer para poder serializar los datos, en su constructor le definimos el tipo mediante GetType, acá lo importante es que el tipo que definimos es el mismo tipo de dato que retorna la consulta LINQ; luego creamos un objeto FileStream para poder crear el archivo y finalmente utilizando el método WriteObject escribimos los datos en el archivo, como argumento le estamos pasando el objeto FileStream creado y la variable que contiene los datos.

Ahora si revisamos el archivo creado vamos a tener algo como:

 1: [{"Ciudad":"Bogota","Codigo":1,"Email":"empleado1@hotmail.com","Nombre":"Empleado 1"},
 2: {"Ciudad":"Bogota","Codigo":2,"Email":"empleado2@hotmail.com","Nombre":"Empleado 2"},
 3: {"Ciudad":"Bogota","Codigo":3,"Email":"empleado3@hotmail.com","Nombre":"Empleado 3"},
 4: {"Ciudad":"Cali","Codigo":4,"Email":"empleado4@hotmail.com","Nombre":"Empleado 4"},
 5: {"Ciudad":"Cali","Codigo":5,"Email":"empleado5@hotmail.com","Nombre":"Empleado 5"},
 6: {"Ciudad":"Medellin","Codigo":6,"Email":"empleado6@hotmail.com","Nombre":"Empleado 6"},
 7: {"Ciudad":"Medellin","Codigo":7,"Email":"empleado7@hotmail.com","Nombre":"Empleado 7"},
 8: {"Ciudad":"Medellin","Codigo":8,"Email":"empleado8@hotmail.com","Nombre":"Empleado 8"}]

 

Espero les haya gustado, como siempre les dejo el código del ejemplo, en el archivo esta en ejemplo en Visual Basic y en C#.

Descarga el ejemplo!

About these ads

8 comentarios en “[ASP.NET] Serializando un consulta LINQ a JSON

    Pablo Alejandro Perez Acosta escribió:
    03/24/2012 en 21:15

    Hola Julio. Gracias por compartir el articulo. Para ver el resultado de este esfuerzo use esta direcciòn en Chrome para visualizar el archivo.

    http://jsonviewer.stack.hu/

    Yo nunca he usado Json pero tengo entendido que es un formato de intercambio de datos através de web mas ligero que xml.

      Julio Avellaneda respondido:
      03/25/2012 en 09:14

      asi es, Json es un formato mas ligero, pero algo importante, Json no reemplaza a XML, es solo una alternativa, recuerda q XML tienw una gran interoperabilidad.

    [...] Making Sense of HTML5 with SharePoint: What Is HTML5?, Integrating ExtJS and ASP.NET MVC e Serializando un consulta LINQ a JSON. O primeiro aborda o HTML5 junto ao Sharepoint, o segundo mostra em um exemplo bem simples como [...]

    [...] [ASP.NET] Serializando un consulta LINQ a JSON [...]

    Resumen Post 2012 « Todo en ASP.NET escribió:
    12/19/2012 en 22:04

    [...] [ASP.NET] Serializando un consulta LINQ a JSON [...]

    Roger escribió:
    08/21/2013 en 17:37

    Muy buen aporte mi amigo… algo asi andaba buscando… se te agradece

      Julio Avellaneda respondido:
      08/21/2013 en 22:03

      Gracias por tu comentario Roger, en verdad es un gusto!

      Saludos.

    Diego escribió:
    02/03/2014 en 08:59

    me podrias echar una manito con este codigo que no logro pasarlo a JSON espero me puedas ayudar. 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

    *****la parte donde tengo que cambiar a JSON son los datos que me arrojara los servicios.

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

    muchas Gracias.

Deja un comentario

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