列挙型は.Net core 3.0 FromBodyリクエストオブジェクトで機能しなくなりました


14

最近、web apiを.Net core 2.2から.Net core 3.0にアップグレードしましたが、ポストの列挙型をエンドポイントに渡すと、リクエストでエラーが発生することに気付きました。例えば:

私のAPIエンドポイントには次のモデルがあります。

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

FeedbackTypeは次のようになります。

    public enum FeedbackType
    {
        Comment,
        Question
    }

そしてこれはコントローラメソッドです:

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

        return Ok(response);
    }

これを投稿の本文としてコントローラーに送信します。

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

そして、私は今、このエンドポイントに次のエラーを投稿しています:

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

これは2.2で機能し、3.0でエラーが発生しました。3.0で変更されたjsonシリアライザーについての話を見ましたが、これがどのように処理されるべきかわかりません。

回答:


18

フレームワークはもはやデフォルトでJson.Netを使用せず、新しい組み込みシリアライザーには独自の問題と期待される機能を取得するための学習曲線があります。

以前のデフォルトのに戻す場合Newtonsoft.Jsonは、次の操作を行う必要があります。

  1. Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGetパッケージをインストールします。

  2. ConfigureServices()呼び出しを追加AddNewtonsoftJson()

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

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

    //...
}

3
両方の手順を実行する必要があることを指摘したいと思います。これは非常に明白ですが、Nugetパッケージを忘れて "AddNewtonsoftJson()"を追加するだけの場合、コードはコンパイルされて正常に実行されますが、機能しません。
Jean-Paul Smit

17

スニペットをお探しの方へ

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

6

あなたが使用している場合、文字列として列挙型をシリアル化するためのサポートがすでに存在してJsonStringEnumConverterを内蔵しており、JsonSerializerOptionsにそれを渡します。 https://docs.microsoft.com/en-us/dotnet/api/system.text.json.serialization.jsonstringenumconverter ?view = netcore-3.0

これを使用するサンプルテストは次のとおりです。https//github.com/dotnet/corefx/blob/master/src/System.Text.Json/tests/Serialization/ReadScenarioTests.cs#L17


1
JsonSerialzerOptionsにJsonStringEnumConverterを渡す方法がわからない人のために、ここでのコードは次のとおりです。services.AddMvc() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); options.JsonSerializerOptions.IgnoreNullValues = true; });
アンソニー・黄
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.