前提
下のようなコントローラを作成したとします。
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 になります。
[
{
"FirstName": "Taro",
"LastName": "Suzuki",
},
{
"FirstName": "Hanako",
"LastName": "Sato",
}
]
フィールド名を snake_case にする
route を定義しているファイル (通常 App_Start/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
を開き、下のように修正します。
<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>
以上で動作するようになるはずです。
[
{
"first_name": "Taro",
"last_name": "Suzuki",
},
{
"first_name": "Hanako",
"last_name": "Sato",
}
]