[ASP.NET] Serializando un consulta LINQ a JSON

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!

8 comments

  • Pablo Alejandro Perez Acosta

    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.

  • Pingback: Dia recheado de publicações e novidades em .Net « Blog do Piruca

  • Pingback: [ASP.NET] Serializando un consulta LINQ a JSON | MSDN Blogs

  • Pingback: Resumen Post 2012 « Todo en ASP.NET

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

  • 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.

Leave a Reply

Your email address will not be published. Required fields are marked *