J'ai récemment mis à niveau mon API Web de .Net core 2.2 vers .Net core 3.0 et j'ai remarqué que mes demandes recevaient maintenant une erreur lorsque je passais une énumération dans un message à mon point de terminaison. Par exemple:
J'ai le modèle suivant pour mon point de terminaison api:
public class SendFeedbackRequest
{
public FeedbackType Type { get; set; }
public string Message { get; set; }
}
À quoi ressemble le FeedbackType:
public enum FeedbackType
{
Comment,
Question
}
Et voici la méthode du contrôleur:
[HttpPost]
public async Task<IActionResult> SendFeedbackAsync([FromBody]SendFeedbackRequest request)
{
var response = await _feedbackService.SendFeedbackAsync(request);
return Ok(response);
}
Où j'envoie ceci en tant que corps de message au contrôleur:
{
message: "Test"
type: "comment"
}
Et je reçois maintenant l'erreur suivante sur ce point de terminaison:
The JSON value could not be converted to MyApp.Feedback.Enums.FeedbackType. Path: $.type | LineNumber: 0 | BytePositionInLine: 13."
Cela fonctionnait dans 2.2 et a commencé l'erreur dans 3.0. J'ai vu parler du changement de sérialiseur json en 3.0, mais je ne sais pas comment cela devrait être géré.
Pour ceux qui recherchent un extrait
la source
StringEnumConverter
, nonJsonStringEnumConverter
.La prise en charge de la sérialisation des énumérations sous forme de chaînes existe déjà si vous utilisez le JsonStringEnumConverter intégré et le transmettez aux JsonSerializerOptions: https://docs.microsoft.com/en-us/dotnet/api/system.text.json.serialization.jsonstringenumconverter ? view = netcore-3.0
Voici un exemple de test qui l'utilise: https://github.com/dotnet/corefx/blob/master/src/System.Text.Json/tests/Serialization/ReadScenarioTests.cs#L17
la source
services.AddMvc() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); options.JsonSerializerOptions.IgnoreNullValues = true; });