LoginSignup
6
2

More than 1 year has passed since last update.

ASP.NET Core のWeb APIが返すJSONのキー名をsnake caseにしたい

Posted at

はじめに

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が利用できるのは便利です。

スクリーンショット 2022-08-30 21.15.55.png

Personの行をクリックして、「try it out」ボタンを押し、Executeボタンをクリックすれば、Person APIを呼び出せます。

スクリーンショット 2022-08-30 21.20.31.png

ちゃんと、first_name, last_name, email_address をsnake_caseになっていることを確認できました。

なお、この記事ではMacで動かしてますが、Windowsでもコード変更なしでそのまま動きます。.NET 6は本当に便利です。

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2