La méthode standard pour afficher les données dans l'API Web ASP.NET est Camel Case. Mais parfois, des tâches surviennent lorsque vous devez changer le format des données en autre chose. Par exemple, sur le frontend, vous pouvez avoir un SPA qui fonctionne avec des données au format de cas de serpent. Dans cet article, je vais vous montrer comment modifier le format de sérialisation dans l'API Web ASP.NET Core.
Cet article fournit des exemples de code que vous devrez transférer dans votre projet. À la fin de l'article, il y a un lien vers le référentiel Github, où j'ai déjà configuré l'application pour sérialiser dans un cas de serpent. Tous les exemples de code et le projet du référentiel sont écrits dans la version ASP.NET Core .net5.
Modification du format de sérialisation des requêtes et réponses du serveur
Tout ce que nous devons faire pour modifier la sérialisation est de définir la stratégie de dénomination dans les paramètres de l'application. La politique standard est Camel Case. L'installation d'une politique sur un cas Snake est une tâche simple.
Tout d'abord, ajoutons des méthodes utilitaires pour transformer des chaînes dans le cas du serpent:
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:
, , …
- , . , 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 :
Après toutes les modifications, notre application envoie et reçoit désormais non seulement des données JSON au format Snake Case, mais affiche également des erreurs de validation sous la forme dont nous avons besoin. Ici, vous pouvez ouvrir le référentiel Github à partir du lien où se trouve un exemple d'application configurée. À travers les étapes décrites, vous pouvez appliquer non seulement Snake Case, mais également tout autre format de sérialisation de données que vous aimez.