Enum türü artık .Net core 3.0 FromBody istek nesnesinde çalışmıyor


14

Son zamanlarda web api .Net çekirdek 2.2'den .Net çekirdek 3.0'a yükselttim ve son noktama bir yayında bir numaralandırma ilettiğimde isteklerimin bir hata aldığını fark ettim. Örneğin:

API uç noktam için aşağıdaki modele sahibim:

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

FeedbackType şöyle görünür:

    public enum FeedbackType
    {
        Comment,
        Question
    }

Ve bu denetleyici yöntemidir:

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

        return Ok(response);
    }

Ben bu post gövdesi olarak denetleyiciye göndermek nerede:

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

Ve şimdi bu uç noktaya gönderilirken aşağıdaki hata mesajını alıyorum:

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

Bu 2.2'de çalışıyordu ve 3.0'da hatayı başlattı. 3.0'da değişen json serileştirici hakkında konuştum, ama bunun nasıl ele alınacağından emin değilim.

Yanıtlar:


18

framework artık Json.Net'i varsayılan olarak kullanmıyor ve yeni yerleşik serileştiricinin beklenen özellikleri elde etmek için kendi sorunları ve öğrenme eğrisi var.

Önceki kullanım varsayılanına geri dönmek Newtonsoft.Jsonisterseniz, aşağıdakileri yapmanız gerekir:

  1. Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet paketini yükleyin .

  2. Gelen ConfigureServices()bir çağrı ekleyinAddNewtonsoftJson()

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

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

    //...
}

3
Her iki adımın da atılması gerektiğini belirtmek isterim. Bu oldukça açık, ama Nuget paketini unutursanız ve yalnızca "AddNewtonsoftJson ()" eklerseniz, kodunuz derlenir ve çalışmazken gayet iyi çalışır.
Jean-Paul Smit

17

Snippet arayanlar için

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

6

Yerleşik JsonStringEnumConverter kullanıyorsanız ve bunu JsonSerializerOptions'a geçirirseniz, numaralandırmaların dizgi olarak serileştirilmesi desteği zaten mevcuttur: https://docs.microsoft.com/en-us/dotnet/api/system.text.json.serialization.jsonstringenumconverter ? görünüşüdür = netcore-3.0

Bunu kullanan örnek bir test: https://github.com/dotnet/corefx/blob/master/src/System.Text.Json/tests/Serialization/ReadScenarioTests.cs#L17


1
JsonStringEnumConverter'ı JsonSerialzerOptions'a nasıl geçireceğini bilmeyenler için, kod:services.AddMvc() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); options.JsonSerializerOptions.IgnoreNullValues = true; });
Anthony Huang
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.