既定では、ASP.NET Core は JSON のシリアル化に System.Text.Json を使用します。
代わりに Newtonsoft を使用する場合は、Microsoft.AspNetCore.Mvc.NewtonsoftJson nuget パッケージを追加してから、次のように Startup.ConfigureServices() で AddNewtonsoftJson() を呼び出します。
public class Startup
{
//rest of class
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers().AddNewtonsoftJson();
//rest of method
}
}
Code language: C# (cs)
この記事では、Newtonsoft シリアライザー オプションを構成する方法を紹介します。
適切な nuget パッケージをインストールする
Microsoft は、フレームワークのバージョンに基づいて Microsoft.AspNetCore.Mvc.NewtonsoftJson をパッケージ化したため、最新のパッケージをそのままインストールすることはできません。使用しているフレームワーク バージョンの最新のものを見つける必要があります。
最新のパッケージをインストールしようとして、対象のフレームワーク バージョンを使用していない場合は、エラーが発生します:
以下に、各フレームワーク バージョンの最新パッケージ (この記事の執筆時点) をリストしました。
注:これらはすべてパッケージ マネージャー コンソール ([表示]> [その他のウィンドウ]> [パッケージ マネージャー コンソール]) を使用しています。
.NET 5
Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson -Version 5.0.8
Code language: PowerShell (powershell)
.NET コア 3.1
Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson -Version 3.1.17
Code language: PowerShell (powershell)
.NET コア 3.0
Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson -Version 3.0.3
Code language: PowerShell (powershell)
ASP.NET Core での Newtonsoft の構成
Newtonsoft を直接使用している場合、シリアル化をカスタマイズするには、JsonSerializerSettings オブジェクトを渡す必要があります。 ASP.NET Core で使用する場合は、JsonSerializerSettings オブジェクトをフレームワーク メソッドに渡します。内部的には、シリアライズ/デシリアライズの際にその設定オブジェクトを Newtonsoft に渡します。
サービス レベルとアクション レベルで Newtonsoft を構成できます。
サービスレベルの設定
サービス レベルで Newtonsoft を構成するには、次のように Startup.ConfigureServices() で AddNewtonsoftJson() を使用します。
using Newtonsoft.Json.Converters;
public class Startup
{
//rest of class
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers()
.AddNewtonsoftJson(jsonOptions =>
{
jsonOptions.SerializerSettings.Converters.Add(new StringEnumConverter());
});
//rest of method
}
}
Code language: C# (cs)
この例では、StringEnumConverter を追加しています。これにより、Newtonsoft は値の代わりに列挙名をシリアライズ/デシリアライズします。
この構成は、すべてのコントローラーに適用されます。フレームワークが応答オブジェクトをシリアル化するか、JSON を使用して要求を逆シリアル化する必要がある場合、指定した設定が使用されます。
注:Newtonsoft はデフォルトで列挙値と名前をデシリアライズしますが、デフォルトでは列挙値のみをシリアライズします。列挙名をシリアル化するには、StringEnumConverter を使用する必要があります。
アクション レベルの設定
シリアライゼーションのアクション レベルで Newtonsoft を構成できます (ただし、デシリアライゼーションはできません)。 JsonResult を返すか、JsonConvert.SerializerObject() を直接呼び出すことができます。
このアプローチは、最後の手段としてのみお勧めします。コントローラが扱うモデル タイプのシリアル化をカスタマイズする必要がある場合は、次のことを検討してください。 代わりにカスタム コンバーターを作成します (およびサービス レベルの構成を行います)。
オプション 1 – JsonResult を返す</strong>
JsonResult オブジェクトを返すと、フレームワークは、渡されたシリアライザー設定を使用してモデル オブジェクトをシリアル化します。現在のシリアライザー (System.Text.Json または Newtonsoft) を使用します。
以下に例を示します:
using Newtonsoft.Json;
using System.Net;
using Newtonsoft.Json.Converters;
[HttpGet("{symbol}")]
public async Task<IActionResult> Get(string symbol)
{
var stock = await GetStockFromRepo(symbol);
var settings = new JsonSerializerSettings()
{
Converters =
{
new StringEnumConverter()
}
};
return new JsonResult(stock, settings)
{
StatusCode = (int)HttpStatusCode.OK
};
}
Code language: C# (cs)
設定パラメータは object 型であることに注意してください .これはタイプ セーフではないため、実行時例外が発生する可能性があります。たとえば、Newtonsoft が構成されていて、System.Text.Json.JsonSerializerOptions オブジェクトを渡すと、次の実行時例外が発生します:
これは、使用しているシリアライザーを知る必要があることを意味します。つまり、JsonConvert.SerializeObject() を直接呼び出す方が実際には安全です。
オプション 2 – JsonConvert.SerializeObject() を直接呼び出す
コントローラ メソッドで Newtonsoft を直接使用するオプションが常にあります。
以下に例を示します:
using Newtonsoft.Json;
using System.Net;
using Newtonsoft.Json.Converters;
[HttpGet("{symbol}")]
public async Task<IActionResult> Get(string symbol)
{
var stock = await GetStockFromRepo(symbol);
var settings = new JsonSerializerSettings()
{
Converters =
{
new StringEnumConverter()
}
};
return new ContentResult()
{
StatusCode = (int)HttpStatusCode.OK,
ContentType = "application/json",
Content = JsonConvert.SerializeObject(stock, settings)
};
}
Code language: C# (cs)
注:このアプローチを使用する場合は、ContentType を明示的に application/json に設定してください。これにより、このオプションは非常に退屈になります。