はじめに
ASP.NET Core 6のWeb APIでJSONデータを返す際に、そのキー名をデフォルトのcamelCaseではなく、snake_case(スネークケース)にする方法を説明します。
環境
.NET 6
ASP.NET Core 6.0
C# 10.0
JsonNamingPolicyを継承したクラスを定義
キー名を変更するConvertNameメソッドを定義します。
using System;
using System.Linq;
using System.Text.Json;
using System.Text;
namespace JsonSerializeSample.Utils;
public class SnakeJsonNamingPolicy : JsonNamingPolicy
{
// ちょっと手抜き SNSAccountsのような名前には対応していない.
public override string ConvertName(string name)
{
var snakeseq = name.Select((x, i) => i > 0 && char.IsUpper(x) ? "_" + x.ToString() : x.ToString());
return string.Concat(snakeseq).ToLower();
}
}
Program.csでJsonの命名ポリシーを設定
using System.Text.Json;
using JsonSerializeSample.Utils;
using Microsoft.Extensions.Options;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers()
.AddJsonOptions(options =>
{
var snakePolicy = new SnakeJsonNamingPolicy();
options.JsonSerializerOptions.DictionaryKeyPolicy = snakePolicy;
options.JsonSerializerOptions.PropertyNamingPolicy = snakePolicy;
});
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
.AddJsonOptions(...)
のところでJsonの命名ポリシーを登録しています。
これでAPIから返るJSONのキー名がsnake_caseになります。
APIを定義してみる
では、APIを定義してみます。
ここではPersonクラスの固定的なオブジェクトを返すだけの単純なものとします。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
namespace JsonSerializeSample.Controllers;
[ApiController]
[Route("[controller]")]
public class PersonController : ControllerBase
{
[HttpGet]
public Person Get()
{
return new Person
{
FirstName = "ひでゆき",
LastName = "いでい",
EmailAddress = "hideyuki.i@example.com",
};
}
}
public class Person
{
public string FirstName { get; set; } = string.Empty;
public string LastName { get; set; } = string.Empty;
public string EmailAddress { get; set; } = string.Empty;
}
これでOKです。
実行してみる
実行してみます。デフォルトでSwaggerが利用できるのは便利です。
Personの行をクリックして、「try it out」ボタンを押し、Executeボタンをクリックすれば、Person API
を呼び出せます。
ちゃんと、first_name
, last_name
, email_address
をsnake_caseになっていることを確認できました。
なお、この記事ではMacで動かしてますが、Windowsでもコード変更なしでそのまま動きます。.NET 6は本当に便利です。