ASP.NET Core – Wie man dafür sorgt, dass die Controller Newtonsoft verwenden

ASP.NET Core – Wie man dafür sorgt, dass die Controller Newtonsoft verwenden

Standardmäßig verwendet ASP.NET Core System.Text.Json für die JSON-Serialisierung.

Wenn Sie stattdessen Newtonsoft verwenden möchten, können Sie das Nuget-Paket Microsoft.AspNetCore.Mvc.NewtonsoftJson hinzufügen und dann AddNewtonsoftJson() in Startup.ConfigureServices() wie folgt aufrufen:

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

In diesem Artikel zeige ich, wie die Newtonsoft-Serializer-Optionen konfiguriert werden.

Installieren Sie das richtige Nuget-Paket

Microsoft hat Microsoft.AspNetCore.Mvc.NewtonsoftJson basierend auf der Framework-Version verpackt, sodass Sie nicht einfach das neueste Paket installieren können. Sie müssen die neueste Version für die von Ihnen verwendete Framework-Version finden.

Wenn Sie versuchen, das neueste Paket zu installieren, und Sie sich nicht auf der Framework-Version befinden, auf die es abzielt, erhalten Sie eine Fehlermeldung:

Ich habe die neuesten Pakete (zum Zeitpunkt des Schreibens dieses Artikels) für jede Framework-Version unten aufgelistet.

Hinweis:All diese verwenden die Paket-Manager-Konsole (Ansicht> Andere Fenster> Paket-Manager-Konsole).

.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)

Newtonsoft in ASP.NET Core konfigurieren

Wenn Sie Newtonsoft direkt verwenden, müssen Sie zum Anpassen der Serialisierung ein JsonSerializerSettings-Objekt übergeben. Wenn Sie es mit ASP.NET Core verwenden, übergeben Sie das JsonSerializerSettings-Objekt an eine Framework-Methode. Intern wird dieses Einstellungsobjekt beim Serialisieren/Deserialisieren an Newtonsoft übergeben.

Sie können Newtonsoft auf Dienstebene und auf Aktionsebene konfigurieren.

Service-Level-Konfiguration

Um Newtonsoft auf Dienstebene zu konfigurieren, verwenden Sie AddNewtonsoftJson() in Startup.ConfigureServices() wie folgt:

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 diesem Beispiel wird der StringEnumConverter hinzugefügt. Dadurch serialisiert/deserialisiert Newtonsoft Aufzählungsnamen anstelle von Werten.

Diese Konfiguration gilt für alle Controller. Wenn das Framework ein Antwortobjekt serialisieren oder eine Anfrage mit JSON deserialisieren muss, verwendet es die von Ihnen bereitgestellten Einstellungen.

Hinweis:Newtonsoft deserialisiert Enum-Werte und -Namen standardmäßig, aber serialisiert standardmäßig nur Enum-Werte. Um Enum-Namen zu serialisieren, müssen Sie StringEnumConverter verwenden.

Konfiguration auf Aktionsebene

Sie können Newtonsoft auf Aktionsebene für die Serialisierung (aber nicht für die Deserialisierung) konfigurieren. Sie können entweder ein JsonResult zurückgeben oder JsonConvert.SerializerObject() direkt aufrufen.

Ich würde diesen Ansatz nur als letzten Ausweg empfehlen. Wenn Sie die Serialisierung für den Modelltyp anpassen müssen, mit dem der Controller arbeitet, sollten Sie in Betracht ziehen Erstellen Sie stattdessen einen benutzerdefinierten Konverter (und führen Sie eine Service-Level-Konfiguration durch).

Option 1 – JsonResult zurückgeben

Wenn Sie ein JsonResult-Objekt zurückgeben, serialisiert das Framework das Modellobjekt mit den von Ihnen übergebenen Serializer-Einstellungen. Es verwendet den aktuellen Serializer (System.Text.Json oder Newtonsoft).

Hier ist ein Beispiel:

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)

Beachten Sie, dass der Einstellungsparameter vom Typ object ist . Dies ist nicht typsicher und kann zu einer Laufzeitausnahme führen. Wenn Sie beispielsweise Newtonsoft konfiguriert haben und ein System.Text.Json.JsonSerializerOptions-Objekt übergeben, erhalten Sie diese Laufzeitausnahme:

Das bedeutet, dass Sie wissen müssen, welchen Serializer Sie verwenden, was bedeutet, dass es tatsächlich sicherer ist, JsonConvert.SerializeObject() direkt aufzurufen.

Option 2 – JsonConvert.SerializeObject() direkt aufrufen

Sie haben immer die Möglichkeit, Newtonsoft direkt in den Controller-Methoden zu verwenden.

Hier ist ein Beispiel:

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)

Hinweis:Wenn Sie diesen Ansatz verwenden, achten Sie darauf, den ContentType explizit auf application/json festzulegen. Das macht diese Option ziemlich mühsam.