ASP.NET Core – コントローラーで Newtonsoft を使用する方法

既定では、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 に設定してください。これにより、このオプションは非常に退屈になります。