Der Aufzählungstyp funktioniert nicht mehr im .Net Core 3.0 FromBody-Anforderungsobjekt

14

Ich habe kürzlich meine Web-API von .Net Core 2.2 auf .Net Core 3.0 aktualisiert und festgestellt, dass meine Anforderungen jetzt einen Fehler erhalten, wenn ich eine Aufzählung in einem Beitrag an meinen Endpunkt übergebe. Zum Beispiel:

Ich habe das folgende Modell für meinen API-Endpunkt:

    public class SendFeedbackRequest
    {
        public FeedbackType Type { get; set; }
        public string Message { get; set; }
    }

Wo der FeedbackType so aussieht:

    public enum FeedbackType
    {
        Comment,
        Question
    }

Und das ist die Controller-Methode:

    [HttpPost]
    public async Task<IActionResult> SendFeedbackAsync([FromBody]SendFeedbackRequest request)
    {
        var response = await _feedbackService.SendFeedbackAsync(request);

        return Ok(response);
    }

Wohin sende ich dies als Postkörper an den Controller:

{
    message: "Test"
    type: "comment"
}

Und ich erhalte jetzt die folgende Fehlermeldung an diesem Endpunkt:

The JSON value could not be converted to MyApp.Feedback.Enums.FeedbackType. Path: $.type | LineNumber: 0 | BytePositionInLine: 13."

Dies funktionierte in 2.2 und startete den Fehler in 3.0. Ich habe gesehen, wie sich der JSON-Serializer in 3.0 geändert hat, bin mir aber nicht sicher, wie ich damit umgehen soll.

Shawn
quelle

Antworten:

18

Das Framework verwendet standardmäßig nicht mehr Json.Net und der neue integrierte Serializer hat seine eigenen Probleme und Lernkurven, um die erwarteten Funktionen zu erhalten.

Wenn Sie zur vorherigen Standardeinstellung zurückkehren möchten Newtonsoft.Json, müssen Sie Folgendes tun:

  1. Installieren Sie das Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet-Paket.

  2. In ConfigureServices()fügen Sie einen AnrufAddNewtonsoftJson()

public void ConfigureServices(IServiceCollection services) {
    //...

    services.AddControllers()
        .AddNewtonsoftJson(); //<--

    //...
}
Nkosi
quelle
3
Ich möchte darauf hinweisen, dass beide Schritte unternommen werden müssen. Was ziemlich offensichtlich ist, aber wenn Sie das Nuget-Paket vergessen und nur "AddNewtonsoftJson ()" hinzufügen, wird Ihr Code kompiliert und läuft einwandfrei, obwohl es nicht funktioniert.
Jean-Paul Smit
17

Für diejenigen, die nach einem Ausschnitt suchen

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers().AddJsonOptions(opt =>
    {
        opt.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
    });
}
Pashec
quelle
6

Die Serialisierung von Enums als Zeichenfolgen wird bereits unterstützt, wenn Sie den integrierten JsonStringEnumConverter verwenden und diese an JsonSerializerOptions übergeben: https://docs.microsoft.com/en-us/dotnet/api/system.text.json.serialization.jsonstringenumconverter view = netcore-3.0

Hier ist ein Beispieltest, der es verwendet: https://github.com/dotnet/corefx/blob/master/src/System.Text.Json/tests/Serialization/ReadScenarioTests.cs#L17

Yigit Tanriverdi
quelle
1
Für diejenigen, die nicht wissen, wie JsonStringEnumConverter an JsonSerialzerOptions übergeben werden soll, ist hier der Code:services.AddMvc() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); options.JsonSerializerOptions.IgnoreNullValues = true; });
Anthony Huang