« Volver
in linq asp.net read.

[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: PublicClass Cliente 2: 3: PublicProperty Codigo AsInteger 4: PublicProperty Nombre AsString 5: PublicProperty Email AsString 6: PublicProperty Ciudad AsString 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: PrivateFunction 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: PrivateSub 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: ProtectedSub btnJson_Click(sender AsObject, 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](http://msdn.microsoft.com/en-us/library/bb397910.aspx), 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](http://msdn.microsoft.com/en-us/library/bb397910.aspx); luego creamos un objeto [FileStream](http://msdn.microsoft.com/en-us/library/system.io.filestream.aspx) 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](http://msdn.microsoft.com/en-us/library/system.io.filestream.aspx) 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!](https://skydrive.live.com/redir.aspx?cid=3619ca7a3d74929a&resid=3619CA7A3D74929A!653&parid=3619CA7A3D74929A!493)
comments powered by Disqus