1. ホーム
  2. c#

[解決済み] .Net Core 3.0でIMvcBuilder AddJsonOptionsはどこに行ったのですか?

2022-04-20 10:41:25

質問

ASP Web API プロジェクトを .NET Framework からアップグレードしたところです。 Net core 2.0 から 3.0 . 私は

     services.AddMvc()
             .AddJsonOptions(options =>options.SerializerSettings.ContractResolver 
                                       = new DefaultContractResolver());

以前は、シリアライズされたJSONを確実に小文字にするために

3.0にアップグレードした後、このエラーが発生します。

エラー CS1061 'IMvcBuilder' は、以下の定義を含んでいません。 AddJsonOptions'およびアクセス可能な拡張メソッド 'AddJsonOptions' はありません。 タイプ 'IMvcBuilder' の第一引数を受け入れるものが見つかりました。 usingディレクティブかアセンブリ参照が足りないのでは?)

によると Asp.Net Core 2.2 の MvcJsonOptions 用に AddJsonOptions を追加しました。 AddJsonOptions 拡張メソッドは マイクロソフト.AspNetCore.Mvc.Formatters.Json nuget パッケージを使用しています。 これをインストール/再インストールしてみましたが、まだメソッドを解決することができません。 興味深いことに、intellisense では Microsoft.AspNetCore.Mvc.Formatters が表示されるだけです。 Xml を追加したにも関わらず、using文を追加しようとすると Json nuget パッケージを使用します。

何が起こっているのか、何か思い当たることはありますか? その ドキュメンテーション に対して AddJsonOptions は.Net 2.2までしか対応していないので、おそらくこのメソッドは3.0では非推奨となり、他の設定メカニズムが採用されたのではないでしょうか?

解決方法は?

ASP.NET Core 3.0 の一部として、チームは Json.NET をデフォルトで含めることから脱却しました。そのことについては、一般的には Microsoft.AspNetCore.Appの変更点に関するお知らせ .

ASP.NET Core 3.0 および .NET Core 3.0 には、Json.NET の代わりに、もう少しパフォーマンスに重点を置いた別の JSON API が含まれています。その詳細については "The future of JSON in .NET Core 3.0 "についてのお知らせです。 .

ASP.NET Core の新しいテンプレートには Json.NET がバンドルされなくなりますが、新しい JSON ライブラリの代わりにそれを使用するようにプロジェクトを簡単に再設定することができます。これは、古いプロジェクトとの互換性の両方にとって重要であり、また、新しいライブラリは完全な置き換えになるはずではないので、そこに完全な機能セットを見ることはありません。

ASP.NET Core 3.0 プロジェクトを Json.NET で再構成するためには、NuGet リファレンスを Microsoft.AspNetCore.Mvc.NewtonsoftJson これは、必要なビットがすべて含まれているパッケージです。そして、スタートアップの ConfigureServices のように、MVCを設定する必要があります。

services.AddControllers()
    .AddNewtonsoftJson();

これは、MVCコントローラを設定し、その新しいAPIの代わりにJson.NETを使用するように設定するものです。コントローラの代わりに、別のMVCオーバーロードを使用することもできます(例:ビューを持つコントローラ、Razorページなど)。その AddNewtonsoftJson メソッドには、Json.NETのオプションを設定するためのオーバーロードがあります。 AddJsonOptions をASP.NET Core 2.xで使用することができます。

services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.ContractResolver = new DefaultContractResolver();
    });