JSON.NET. Mejorando la serialización JSON con .NET

Hace algún tiempo que os hablamos en devjoker.com de como utilizar JSON en aplicaciones ASP.NET -http://www.devjoker.com/contenidos/catss/459/Serializacioacuten-JSON-con-NET.aspx. Es este articulo serializábamos un objeto utilizando la clase JavaScriptSerializer incluido con .NET Framework en el assembly System.Web.Script.Serialization.

En esta ocasión vamos a realizar el mismo ejercicio de serialización pero a través de la librería JSON.NET. La utilización de esta librería nos va a aportar las siguientes ventajas:

  • Una forma de trabajar sencilla y unificada para todas nuestras clases. No tendremos que escribir un nuevo método ToJson() en cada clase, como ocurría en el ejemplo anterior.
  • JSON.NET nos permite serializar de .NET a JSON, pero también de forma inversa de JSON a .NET.
  • Un nuevo sabor de LINQ: LINQ To JSON.

Pero vamos a realizar una pequeña aplicación de ejemplo para ver lo fácil que resulta trabajar con JSON.NET. Lo primero creamos un sitio web vacío:

image 

Utilizando NuGet añadimos al proyecto las referencia a JSON.NET y también a jQuery -para simplificar el trabajo con Ajax.

El proyecto constará de los siguientes elementos:

  • Un HttpHandler, DataHanlder.ashx – que nos va a permitir gestionar las llamadas para obtener un resultado serializado en JSON.
  • Un Web Form, Default.aspx, que nos servirá como página de inicio y desde donde realizaremos las llamadas al handler anterior.

La siguiente imagen muestra el aspecto que debería tener  el explorador de soluciones (el resto de los elementos se crean al añadir las referencias con NuGet).

image

Ahora escribimos el código del handler:

<%@ WebHandler Language="C#" Class="DataHanlder" %>
using System;
using System.Web;

public class DataHanlder : IHttpHandler {

    class Persona {
        public Guid Id { get; set; }
        public string Nombre { get; set; }
        public string Apellidos { get; set; }
        public string FechaNacimiento { get; set; }
    }
    
    public void ProcessRequest (HttpContext context) {
        context.Response.ContentType = "application/json";
        var devjoker = new Persona() { 
            Id = Guid.NewGuid(),
            Nombre = "Pedro", 
            Apellidos = "Herrarte",
            FechaNacimiento = new DateTime (1975,01,13).ToString("d") 
        };
        var json = Newtonsoft.Json.JsonConvert.SerializeObject(devjoker);
        context.Response.Write( json );
    }
 
    public bool IsReusable {
        get {
            return false;
        }
    }
}

Para simplificar, hemos incrustado la clase Persona dentro del propio handler. Las peticiones se procesan en el método ProcessRequest, que el framework invoca automáticamente al recibirse una petición al handler. En este método creamos un objeto Persona y lo serializamos a JSON con la clase JsonConverter, y devolvemos la respuesta por http normalmente. Así de fácil.

Si quisiéramos obtener el objeto .NET a partir del JSON seria tan sencillo como hacer lo siguiente:

var inputJson = @"{
    ""Id"":""bb816aa1-feab-4e35-b9be-80f1273d4913"",
    ""Nombre"":""Pedro"",
    ""Apellidos"":""Herrarte"",
    ""FechaNacimiento"":""20/01/1975""}";
Persona deserializedPersona = Newtonsoft.Json.JsonConvert.DeserializeObject<Persona>(inputJson);

image

Ahora vamos a la página .aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html >

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script src="Scripts/jquery-1.7.1.min.js" type="text/javascript"></script>
    <script>
        $(document).ready(function () {
            $("#btnConsulta").click(buscar);
        });

        function buscar() {
            var postData= null;
            $.post('Handlers/DataHanlder.ashx', postData, function (result) {
                $("#txtId").val(result.Id);
                $("#txtNombre").val(result.Nombre);
                $("#txtApellidos").val(result.Apellidos);
                $("#txtFechaNacimiento").val(result.FechaNacimiento);
            });
        }
    </script>
</head>
<body>
    <form id="form1" runat="server" enableviewstate="false">
    <div>
        <asp:Label ID="Label1" runat="server" Text="ID:"></asp:Label>
        <asp:TextBox ID="txtId" runat="server"></asp:TextBox>
        <asp:Label ID="Label2" runat="server" Text="Nombre:"></asp:Label>
        <asp:TextBox ID="txtNombre" runat="server"></asp:TextBox>
        <asp:Label ID="Label3" runat="server" Text="Apellidos:"></asp:Label>
        <asp:TextBox ID="txtApellidos" runat="server"></asp:TextBox>
        <asp:Label ID="Label4" runat="server" Text="Fecha Nacimiento:"></asp:Label>
        <asp:TextBox ID="txtFechaNacimiento" runat="server"></asp:TextBox>
        <hr />
        <input type="button" ID="btnConsulta"  value="Buscar" />
    </div>
    </form>
</body>
</html>

 

Lo primero que debermos asegurar es que hemos incluido la referencia a jQuery, a patir de ahí, incluimos el script inicial de la página $(document).ready(…); donde establecemos el enlace del evento click del botón btnConsulta y la función buscar,  esta función realiza una llamada al handler que hemos creado anteriormente, y procesa el resultado para mostrarlo en pantalla.

La aplicación en ejecución:

image

Si analizamos el tráfico con Fiddler podemos ver la llamada al hanlder y la respuesta obtenida:

HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Wed, 25 Jan 2012 14:45:30 GMT
X-AspNet-Version: 4.0.30319
Cache-Control: private
Content-Type: application/json; charset=utf-8
Content-Length: 116
Connection: Close

{"Id":"bb816aa1-feab-4e35-b9be-80f1273d4913","Nombre":"Pedro","Apellidos":"Herrarte","FechaNacimiento":"13/01/1975"}

Como podemos ver el resultado obtenido está serializado en JSON perfectamente, y sin apenas esfuerzo.

En la página del autor - http://james.newtonking.com/projects/json/help/ - disponemos además de muchos ejemplos que nos permitirán sacar el máximo rendimiento a JSON.NET.

Saludos,

DJK

Pedro  Herrarte  Sánchez
JSON.NET. Mejorando la serialización JSON con .NET
Pedro Herrarte Sánchez

Pedro Herrarte, es consultor independiente, ofreciendo servicios de consultoría, análisis, desarrollo y formación. Posee mas de diez años de experiencia trabajando para las principales empresas de España. Es especialista en tecnologías .NET, entornos Web (ASP.NET, ASP.NET MVC,jQuery, HTML5), bases de datos (SQL Server y ORACLE) e integración de sistemas. Es experto en desarrollo (C#, VB.Net, T-SQL, PL/SQL, , ASP, CGI , C, Pro*C, Java, Essbase, Vignette, PowerBuilder y Visual Basic ...) y bases de datos (SQL Server y ORACLE). Pedro es MCP y MAP 2012, es fundador, diseñador y programador de www.devjoker.com..
Fecha de alta:25/01/2012
Última actualizacion:25/01/2012
Visitas totales:28389
Valorar el contenido:
Últimas consultas realizadas en los foros
Últimas preguntas sin contestar en los foros de devjoker.com