Cómo cambiar el formato de datos JSON a Snake Case en ASP.NET Core Web API

La forma estándar de mostrar datos en ASP.NET Web API es Camel Case. Pero a veces surgen tareas cuando necesita cambiar el formato de los datos por otro. Por ejemplo, en la interfaz, es posible que tenga un SPA que funcione con datos en el formato de caso de serpiente. En este artículo, le mostraré cómo cambiar el formato de serialización en ASP.NET Core Web API.





Caso camel vs caso serpiente
Caso camel vs caso serpiente

Este artículo proporciona ejemplos de código que deberá transferir a su proyecto. Al final de la publicación hay un enlace al repositorio de Github, donde ya he configurado la aplicación para serializar en un caso de serpiente. Todos los ejemplos de código y el proyecto en el repositorio están escritos en la versión ASP.NET Core .net5.





Cambiar el formato de serialización de las solicitudes y respuestas del servidor

Todo lo que tenemos que hacer para cambiar la serialización es configurar la Política de nombres en la configuración de la aplicación. La política estándar es Camel Case. Instalar una política en un Snake Case es una tarea sencilla.





Primero, agreguemos métodos utilitarios para transformar cadenas al caso de la serpiente:





using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using Utils.Helpers;

namespace YourNamespace
{
    public static class JsonSerializationExtensions
    {
        private static readonly SnakeCaseNamingStrategy _snakeCaseNamingStrategy
            = new SnakeCaseNamingStrategy();

        private static readonly JsonSerializerSettings _snakeCaseSettings = new JsonSerializerSettings
        {
            ContractResolver = new DefaultContractResolver
            {
                NamingStrategy = _snakeCaseNamingStrategy
            }
        };

        public static string ToSnakeCase(this T instance)
        {
            if (instance == null)
              {
                   throw new ArgumentNullException(paramName: nameof(instance));
               }

            return JsonConvert.SerializeObject(instance, _snakeCaseSettings);
        }

        public static string ToSnakeCase(this string @string)
        {
            if (@string == null)
              {
                   throw new ArgumentNullException(paramName: nameof(@string));
               }

            return _snakeCaseNamingStrategy.GetPropertyName(@string, false);
        }
    }
}

      
      



: , - . SnakeCaseNamingStrategy



  . Naming Policy: 





using System.Text.Json;
using Utils.Serialization;

namespace YourNamespace
{
    public class SnakeCaseNamingPolicy : JsonNamingPolicy
    {
        public override string ConvertName(string name) => name.ToSnakeCase();
    }
}

      
      



- ToSnakeCase()



. SnakeCaseNamingPolicy



  Startup.cs



 ConfigureServices



:





public class Startup
{
  public void ConfigureServices(IServiceCollection services)
  {
    // ...
    services
        .AddMvc()
        .AddJsonOptions(x =>
        {
            x.JsonSerializerOptions.PropertyNamingPolicy = new SnakeCaseNamingPolicy();
        });
    // ...
  }
}

      
      



, Web API, .AddMvc()



.AddControllers()



, . Web API MVC.





JSON Snake Case:





Datos de Snake Case
Snake Case

, , …





Formato para emitir errores de validación hasta ahora en Camel Case
Camel Case

- , . , Camel Case, . , FirstName LastName Pascal Case, Snake Case. , .





, " " ASP . , :





using System;
using System.Collections.Generic;
using System.Net;
using Microsoft.AspNetCore.Mvc;

namespace YourNamespace
{
    public class ValidationProblemDetails : ProblemDetails
    {
        // 400 status ccode is usually used for input validation errors
        public const int ValidationStatusCode = (int)HttpStatusCode.BadRequest;

        public ValidationProblemDetails(ICollection validationErrors)
        {
            ValidationErrors = validationErrors;
            Status = ValidationStatusCode;
            Title = "Request Validation Error";
        }

        public ICollection ValidationErrors { get; }

        public string RequestId => Guid.NewGuid().ToString();
    }
}

      
      



, JSON. ProblemDetails



  Microsoft.AspNetCore.Mvc



. RequestId UI .





InvalidModelStateResponseFactory



:





using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Utils.Serialization;

namespace YourNamespace
{
    public class ValidationProblemDetailsResult : IActionResult
    {
        public async Task ExecuteResultAsync(ActionContext context)
        {
            var modelStateEntries = context.ModelState
                .Where(e => e.Value.Errors.Count > 0)
                .ToArray();

            var errors = new List();

            if (modelStateEntries.Any())
            {
                foreach (var (key, value) in modelStateEntries)
                {
                    errors.AddRange(value.Errors
                        .Select(modelStateError => new ValidationError(
                            name: key.ToSnakeCase(),
                            description: modelStateError.ErrorMessage)));
                }
            }

            await new JsonErrorResponse(
                context: context.HttpContext,
                error: new ValidationProblemDetails(errors),
                statusCode: ValidationProblemDetails.ValidationStatusCode).WriteAsync();
        }
    }
}

      
      



Startup.cs



:





public class Startup
{
   // ...
  public void ConfigureServices(IServiceCollection services)
  {
    // ...
    services
        .Configure(x =>
        {
            x.InvalidModelStateResponseFactory = ctx => new ValidationProblemDetailsResult();
        });
    // ...
  }
}

      
      



Snake Case :





Estructura de error de Snake Case
Snake Case

Después de todos los cambios, nuestra aplicación ahora no solo envía y recibe datos JSON en el formato Snake Case, sino que también muestra errores de validación en la forma que necesitamos. Aquí puedes abrir el repositorio de Github desde el enlace donde hay un ejemplo de una aplicación configurada. A través de los pasos descritos, puede aplicar no solo Snake Case, sino también cualquier otro formato de serialización de datos que desee.








All Articles