1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ASP.NET Web API でレスポンスの JSON を snake_case にする

Posted at

前提

下のようなコントローラを作成したとします。

SampleController.cs
namespace SampleProject.Controllers
{
    public class SampleController: ApiController
    {
        // GET api
        public List<User> Get()
        {
            return new List<User>()
            {
                new User() { FirstName = "Taro", LastName = "Suzuki" },
                new User() { FirstName = "Hanako", LastName = "Sato" }
            };
        }
    }
}

このとき Content-Type を application/json にすると JSON のレスポンスが得られるわけですが、フィールド名がデフォルトだと CamelCase になります。

response.json
[
  {
    "FirstName": "Taro",
    "LastName": "Suzuki",
  },
  {
    "FirstName": "Hanako",
    "LastName": "Sato",
  }
]

フィールド名を snake_case にする

route を定義しているファイル (通常 App_Start/WebApiConfig.cs) に設定を追加します。

WebApiConfig.cs
using System.Web.Http;
using Newtonsoft.Json.Serialization;

namespace SampleProject
{
    public class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(/* route の定義 */);
            
            // これを追加
            config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver()
            {
                NamingStrategy = new SnakeCaseNamingStrategy()  // ここで NamingStrategy が見つからない場合は次節を参照
            };
        }
    }
}

Newtonsoft.JSON をアップデートする

上のコード中にコメントしていますが、NamingStrategy プロパティや SnakeCaseNamingStrategy クラスが存在しないためエラーが出ていました。これは ASP.NET をセットアップしたときにバンドルされている Newtonsoft.JSON が古い(v6.0.4)のが原因なので、アップデートが必要です。

NuGet パッケージマネージャから Newtonsoft.JSON を検索し、アップデートしてください。リリースノート によると、v9.0.1 で入った機能のようなので、それ以上にします。以下の説明では執筆時点(2018年10月23日)の最新版 v11.0.2 を使っています。

MSB3247 警告が出る場合

アップデート後、ビルドすると以下の警告が出ました。

Microsoft.Common.CurrentVersion.targets(2052, 5): [MSB3247] 同じ依存アセンブリの異なるバージョン間で競合が見つかりました。Visual Studio では、この警告をダブルクリックする (または選択して Enter キーを押す) ことで、この競合を修正できます。または、アプリケーション構成ファイル内の "runtime" ノードに、次のバインド リダイレクトを追加します: <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"><dependentAssembly><assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" /><bindingRedirect oldVersion="0.0.0.0-11.0.0.0" newVersion="11.0.0.0" /></dependentAssembly></assemblyBinding>

警告で言われている通りに、設定を修正します。プロジェクト直下の Web.config を開き、下のように修正します。

Web.config.diff
<configure>
  <!-- 略 -->
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
-        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
+        <bindingRedirect oldVersion="0.0.0.0-11.0.0.0" newVersion="11.0.0.0" />
      </dependentAssembly>

以上で動作するようになるはずです。

response.json
[
  {
    "first_name": "Taro",
    "last_name": "Suzuki",
  },
  {
    "first_name": "Hanako",
    "last_name": "Sato",
  }
]
1
3
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
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?