I have recently upgraded my web api from .Net core 2.2 to .Net core 3.0 and noticed that my requests are getting an error now when I pass an enum in a post to my endpoint. For example:
I have the following model for my api endpoint:
public class SendFeedbackRequest
{
public FeedbackType Type { get; set; }
public string Message { get; set; }
}
Where the FeedbackType looks like so:
public enum FeedbackType
{
Comment,
Question
}
And this is the controller method:
[HttpPost]
public async Task<IActionResult> SendFeedbackAsync([FromBody]SendFeedbackRequest request)
{
var response = await _feedbackService.SendFeedbackAsync(request);
return Ok(response);
}
Where I send this as the post body to the controller:
{
message: "Test"
type: "comment"
}
And I am now getting the following error posting to this endpoint:
The JSON value could not be converted to MyApp.Feedback.Enums.FeedbackType. Path: $.type | LineNumber: 0 | BytePositionInLine: 13."
This was working in 2.2 and started the error in 3.0. I saw talk about the json serializer changing in 3.0, but not sure how this should be handled.
framework no longer uses Json.Net by default and the new built-in serializer has its own issues and learning curve to get the expected features.
If you’d like to switch back to the previous default of using Newtonsoft.Json
, then you'll have to do the following:
Install the Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet package.
In
ConfigureServices()
add a call toAddNewtonsoftJson()
public void ConfigureServices(IServiceCollection services) {
//...
services.AddControllers()
.AddNewtonsoftJson(); //<--
//...
}
Support for serializing enums as strings already exist if you use the built-in JsonStringEnumConverter and pass that into the JsonSerializerOptions: https://docs.microsoft.com/en-us/dotnet/api/system.text.json.serialization.jsonstringenumconverter?view=netcore-3.0
Here's a sample test that uses it: https://github.com/dotnet/corefx/blob/master/src/System.Text.Json/tests/Serialization/ReadScenarioTests.cs#L17
For those who is looking for a snippet
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers().AddJsonOptions(opt =>
{
opt.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
});
}
来源:https://stackoverflow.com/questions/58440400/enum-type-no-longer-working-in-net-core-3-0-frombody-request-object