Personalizando la serialización Json en ASP.NET Web API

Una de las mejores características que nos ofrece ASP.NET Web Api es la serialización JSON usando la popular librería JSON.NET. Para los que no la conocen, puedo decirles que es una de las mejores librerías en el mundo .NET, ofrece una gran cantidad de características y capacidades, además de ser altamente flexible y fácil de configurar.

En un post anterior ya les mostré como pueden hacer que Web Api use por defecto la serialización JSON, ahora veremos cómo podemos personalizar un poco las características de esa serialización.

Lo primero que podemos hacer, es personalizar la serialización en las clases modelo mediante el uso de atributos. En el siguiente ejemplo, vemos una clase donde cambiamos el nombre de una propiedad e ignoramos otra propiedad para que no sea incluida en la serialización:

public class Producto
{
    public int Id { getset; }
 
    public string Nombre { getset; }
 
    public decimal Precio { getset; }
 
    [JsonProperty("Categoria")]
    public string Tipo { getset; }
 
    [JsonIgnore]
    public int Cantidad { getset; }
}

Al ver la serialización que se produce para este objeto mediante un navegador, podemos ver lo siguiente:

CustomJson01

 

Igualmente, podemos modificar otros aspectos propios de la serialización,  como los siguientes: cambiar la capitalización de las letras (para usar Camel Case en el JSON, por ejemplo), cambiar formatos de fechas, cambiar la cultura, ignorar valores nulos, etc. Esto lo podemos hacer fácilmente modificando un poco el archivo WebApiConfig.cs de un proyecto de código ASP.NET Web Api, de la siguiente manera:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        config.Formatters.Remove(config.Formatters.XmlFormatter);
 
        ConfigureJsonFormatter(config);
 
        // Web API routes
        config.MapHttpAttributeRoutes();
 
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
 
    private static void ConfigureJsonFormatter(HttpConfiguration config)
    {
        var jsonFormatter = config.Formatters.JsonFormatter;
 
        // Cambiar capitalización a las letras
        jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            
        // Ignorar valores nulos
        jsonFormatter.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
 
        // Cambiar formato de fecha
        jsonFormatter.SerializerSettings.DateFormatHandling = Newtonsoft.Json.DateFormatHandling.MicrosoftDateFormat;
 
        // Cambiar la cultura
        jsonFormatter.SerializerSettings.Culture = new CultureInfo("en-US");
    }
}

A continuación, podemos ver en las imágenes algunas de las consecuencias que tiene dicha configuración, por ejemplo para la capitalización:

CustomJson02

En cuanto al cambio en el formato de fecha, podemos ver las diferencias en este otro ejemplo:

CustomJson03

De esta forma, estamos cambiando la configuración para toda la API, ¡pero esto no es todo!

ASP.NET Web Api también nos permite hacer modificaciones en métodos puntuales, si lo que queremos es no aplicar la configuración sobre toda la API en general. A continuación un ejemplo de cómo podemos hacer las modificaciones en un método:

public HttpResponseMessage Get(int id)
{
    Producto producto = ConsultarProducto(id);
 
    var jsonFormatter = new JsonMediaTypeFormatter();
            
    jsonFormatter.SerializerSettings.DateFormatHandling = Newtonsoft.Json.DateFormatHandling.MicrosoftDateFormat;
    jsonFormatter.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
    jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
    jsonFormatter.SerializerSettings.Culture = new CultureInfo("en-US");
 
    return Request.CreateResponse(HttpStatusCode.OK, producto, jsonFormatter);
}

En resumen, esta flexibilidad es una de las grandes características que ofrece ASP.NET Web Api, asi como ASP.NET MVC. Hasta el momento es todo. ¡Espero que esta información les haya sido útil!.

Anuncios

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

A %d blogueros les gusta esto: