Cara mengubah format data JSON menjadi Snake Case di ASP.NET Core Web API

Cara standar untuk menampilkan data di ASP.NET Web API adalah Camel Case. Namun terkadang tugas muncul saat Anda perlu mengubah format data menjadi sesuatu yang lain. Misalnya, di frontend, Anda mungkin memiliki SPA yang berfungsi dengan data dalam format kasus ular. Pada artikel ini, saya akan menunjukkan kepada Anda bagaimana mengubah format serialisasi di ASP.NET Core Web API.





Kasus unta vs kasus ular
Kasus unta vs kasus ular

Artikel ini memberikan contoh kode yang perlu Anda transfer ke proyek Anda. Di akhir posting ada tautan ke repositori Github, di mana saya sudah mengkonfigurasi aplikasi untuk membuat serial dalam kasus ular. Semua contoh kode dan proyek di repositori ditulis dalam versi ASP.NET Core .net5.





Mengubah format serialisasi permintaan dan tanggapan server

Yang perlu kita lakukan untuk mengubah serialisasi adalah mengatur Kebijakan Penamaan di pengaturan aplikasi. Kebijakan standarnya adalah Camel Case. Menginstal kebijakan pada Kasus Ular adalah tugas yang sederhana.





Pertama, mari tambahkan metode utilitarian untuk mengubah string menjadi kotak ular:





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:





Data Kasus Ular
Snake Case

, , …





Format untuk mengeluarkan kesalahan validasi sejauh ini dalam Kasus Camel
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 :





Struktur kesalahan Kasus Ular
Snake Case

Setelah semua perubahan, aplikasi kami sekarang tidak hanya mengirim dan menerima data JSON dalam format Kasus Ular, tetapi juga menunjukkan kesalahan validasi dalam bentuk yang kami butuhkan. Di sini Anda dapat membuka repositori Github dari tautan di mana terdapat contoh aplikasi yang dikonfigurasi. Melalui langkah-langkah yang dijelaskan, Anda tidak hanya dapat menerapkan Kasus Ular, tetapi juga format serialisasi data lainnya yang Anda sukai.








All Articles