ASP.NET Core – Come fare in modo che i controller utilizzino Newtonsoft

ASP.NET Core – Come fare in modo che i controller utilizzino Newtonsoft

Per impostazione predefinita, ASP.NET Core usa System.Text.Json per la serializzazione JSON.

Se invece desideri utilizzare Newtonsoft, puoi aggiungere il pacchetto nuget Microsoft.AspNetCore.Mvc.NewtonsoftJson, quindi chiamare AddNewtonsoftJson() in Startup.ConfigureServices() in questo modo:

public class Startup
{
	//rest of class
	
	public void ConfigureServices(IServiceCollection services)
	{
		services.AddControllers().AddNewtonsoftJson();
		
		//rest of method
	}
}
Code language: C# (cs)

In questo articolo, mostrerò come configurare le opzioni del serializzatore Newtonsoft.

Installa il pacchetto nuget corretto

Microsoft ha impacchettato Microsoft.AspNetCore.Mvc.NewtonsoftJson in base alla versione del framework, quindi non puoi semplicemente installare il pacchetto più recente. Devi trovare l'ultimo per la versione del framework che stai utilizzando.

Se provi a installare il pacchetto più recente e non sei sulla versione del framework di destinazione, riceverai un errore:

Di seguito ho elencato gli ultimi pacchetti (al momento in cui scrivo) per ciascuna versione del framework.

Nota:tutti questi utilizzano la Console di gestione dei pacchetti (Visualizza> Altre finestre> Console di gestione dei pacchetti).

.NET 5

Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson -Version 5.0.8
Code language: PowerShell (powershell)

.NET Core 3.1

Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson -Version 3.1.17
Code language: PowerShell (powershell)

.NET Core 3.0

Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson -Version 3.0.3
Code language: PowerShell (powershell)

Configurazione di Newtonsoft in ASP.NET Core

Quando utilizzi direttamente Newtonsoft, per personalizzare la serializzazione devi passare un oggetto JsonSerializerSettings. Quando lo usi con ASP.NET Core, passi l'oggetto JsonSerializerSettings a un metodo framework. Internamente, passerà l'oggetto delle impostazioni a Newtonsoft durante la serializzazione/deserializzazione.

Puoi configurare Newtonsoft a livello di servizio ea livello di azione.

Configurazione a livello di servizio

Per configurare Newtonsoft a livello di servizio, usa AddNewtonsoftJson() in Startup.ConfigureServices() in questo modo:

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)

In questo esempio, sta aggiungendo StringEnumConverter. Ciò fa sì che Newtonsoft serializzi / deserializzi i nomi degli enum anziché i valori.

Questa configurazione si applica a tutti i controller. Quando il framework deve serializzare un oggetto risposta o deserializzare una richiesta con JSON, utilizzerà le impostazioni che hai fornito.

Nota:Newtonsoft deserializza valori e nomi enum per impostazione predefinita, ma serializza solo valori enum per impostazione predefinita. Per serializzare i nomi enum, devi farlo utilizzare StringEnumConverter.

Configurazione a livello di azione

È possibile configurare Newtonsoft a livello di azione per la serializzazione (ma non per la deserializzazione). Puoi restituire un JsonResult o chiamare direttamente JsonConvert.SerializerObject().

Consiglierei questo approccio solo come ultima risorsa. Se hai bisogno di personalizzare la serializzazione per il tipo di modello con cui ha a che fare il controller, potresti prendere in considerazione creando invece un convertitore personalizzato (ed eseguendo la configurazione a livello di servizio).

Opzione 1 – Restituisci JsonResult

Quando restituisci un oggetto JsonResult, il framework serializzerà l'oggetto modello usando le impostazioni del serializzatore che hai passato. Utilizzerà il serializzatore corrente (System.Text.Json o Newtonsoft).

Ecco un esempio:

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)

Si noti che il parametro delle impostazioni è di tipo oggetto . Questo non è sicuro dai tipi e può portare a un'eccezione di runtime. Ad esempio, se hai configurato Newtonsoft e passi un oggetto System.Text.Json.JsonSerializerOptions, otterrai questa eccezione di runtime:

Ciò significa che devi sapere quale serializzatore stai utilizzando, il che significa che in realtà è più sicuro chiamare direttamente JsonConvert.SerializeObject().

Opzione 2:chiama direttamente JsonConvert.SerializeObject()

Hai sempre la possibilità di utilizzare direttamente Newtonsoft nei metodi del controller.

Ecco un esempio:

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)

Nota:se utilizzi questo approccio, assicurati di impostare esplicitamente ContentType su application/json. Questo rende questa opzione piuttosto noiosa.