Die Standardmethode zum Anzeigen von Daten in der ASP.NET-Web-API ist Camel Case. Manchmal treten jedoch Aufgaben auf, wenn Sie das Datenformat in etwas anderes ändern müssen. Im Frontend verfügen Sie möglicherweise über ein SPA, das mit Daten im Schlangenfallformat arbeitet. In diesem Artikel werde ich Ihnen zeigen, wie Sie das Serialisierungsformat in der ASP.NET Core-Web-API ändern.
Dieser Artikel enthält Codebeispiele, die Sie in Ihr Projekt übertragen müssen. Am Ende des Beitrags befindet sich ein Link zum Github-Repository, in dem ich die Anwendung bereits für die Serialisierung in einem Schlangenfall konfiguriert habe. Alle Codebeispiele und das Projekt im Repository sind in der ASP.NET Core .net5-Version geschrieben.
Ändern des Serialisierungsformats von Serveranforderungen und -antworten
Alles, was wir tun müssen, um die Serialisierung zu ändern, ist die Namensrichtlinie in den Anwendungseinstellungen festzulegen. Die Standardrichtlinie ist Camel Case. Das Installieren einer Richtlinie in einem Snake Case ist eine einfache Aufgabe.
Fügen wir zunächst nützliche Methoden zum Transformieren von Zeichenfolgen zum Schlangenfall hinzu:
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 :
Nach all den Änderungen sendet und empfängt unsere Anwendung jetzt nicht nur JSON-Daten im Snake Case-Format, sondern zeigt auch Validierungsfehler in der von uns benötigten Form an. Hier können Sie das Github-Repository über den Link öffnen, unter dem sich ein Beispiel für eine konfigurierte Anwendung befindet. Mit den beschriebenen Schritten können Sie nicht nur Snake Case anwenden, sondern auch jedes andere von Ihnen gewünschte Serialisierungsformat für Daten.