IMvcBuilder AddJsonOptionsは.Net Core 3.0のどこにありますか?


119

からASP Web APIプロジェクトをアップグレードしました。Net core 2.03.0。使っていた

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

以前は、シリアル化されたJSONの小文字を保証します。

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

エラーCS1061 'IMvcBuilder'には 'AddJsonOptions'の定義が含まれておらず、タイプ 'IMvcBuilder'の最初の引数を受け入れるアクセス可能な拡張メソッド 'AddJsonOptions'が見つかりません(usingディレクティブまたはアセンブリ参照がありませんか?)

Asp.Net Core 2.2のMvcJsonOptionsのAddJsonOptionsによると、AddJsonOptions拡張メソッドは、Microsoft.AspNetCore.Mvc.Formatters.Json nugetパッケージによって提供されてます。これをインストール/再インストールしようとしましたが、それでもメソッドを解決できません。興味深いことに、IntelliSenseはMicrosoft.AspNetCore.Mvc.Formattersのみを表示します。XML私は追加にもかかわらず、usingステートメントを追加しようとすると、JSON nugetパッケージを。

何が起こっているのですか?AddJsonOptionsドキュメントは.Net 2.2までしか公開されていないため、3.0でこのメソッドが廃止され、他の構成メカニズムが採用された可能性があります。

回答:


203

ASP.NET Core 3.0の一部として、チームはデフォルトでJson.NETを含めることをやめました。これについては、Microsoft.AspNetCore.Appへの重大な変更に関する発表で一般的に詳しく説明されています。

Json.NETの代わりに、ASP.NET Core 3.0および.NET Core 3.0には、パフォーマンスをもう少し重視する別のJSON APIが含まれています。詳細については、「。NET Core 3.0におけるJSONの将来」に関する発表をご覧ください。。

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

ASP.NET Core 3.0プロジェクトをJson.NETで再構成するにMicrosoft.AspNetCore.Mvc.NewtonsoftJsonは、必要なすべてのビットを含むパッケージであるへのNuGet参照を追加する必要があります。次に、スタートアップConfigureServicesので、次のようにMVCを構成する必要があります。

services.AddControllers()
    .AddNewtonsoftJson();

これにより、MVCコントローラーがセットアップされ、新しいAPIの代わりにJson.NETを使用するように構成されます。コントローラーの代わりに、別のMVCオーバーロードを使用することもできます(たとえば、ビューを持つコントローラー、またはRazorページの場合)。このAddNewtonsoftJsonメソッドには、AddJsonOptionsASP.NET Core 2.xで使用していたようなJson.NETオプションを構成できるオーバーロードがあります。

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

41
自宅でフォローしている人のために...プロジェクトを移行するときに、 "AddNewtonsoftJson"拡張機能を取得するために "Microsoft.AspNetCore.Mvc.NewtonsoftJson"へのnuget参照を追加する必要がある場合があります。執筆時点では、Visual Studio Nuget Managerを使用している場合は、「プレリリースを含める」をチェックする必要があります。
NeilMacMullen

1
まだ実際のアプリケーションでASP.NET Core 3に移行することはまだお勧めしません。試してみたいだけなら、確かですが、最終リリースまでにまだいくつかの変更点があるため、早期に移行したい場合は、それを覚えておく必要があります。
突く

1
これにより、「同期操作は許可されません」をトリガーできます。詳細については、stackoverflow.com
questions / 47735133 /…を

8
そのAddNewtonsoftJson参照をMicrosoft.AspNetCore.Mvc.NewtonsoftJson参照した後でも、私にとって欠落しています。
Saeed Neamati

2
@avenmore新しいシリアライザーは、別個の属性セットを使用します。名前空間[JsonIgnore]から使用できSystem.Text.Json.Serializationます。
突く

21

これは私にとってうまくいきました、使用中.Net Core 3

services.AddMvc().AddJsonOptions(o =>
{
    o.JsonSerializerOptions.PropertyNamingPolicy = null;
    o.JsonSerializerOptions.DictionaryKeyPolicy = null;
});

行は次のようになるはずですo.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
。– Grandizer

1
私もそうですが、そうではありません。この答えは私にとってもうまくいきました。
Martin

2
使用する必要はありませんo.JsonSerializerOptions.DictionaryKeyPolicy = null;o.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
シャハルShokrani

この答えを使用したいのですが、アプリケーションはNewtonsoftの属性を使用して構築されました。新しいMSシリアライザーはこれを無視します。つまり、AddNewtonsoftJsonでNewtonsoftシリアライザーを引き続き使用する必要があります。たぶん、MSはNewtonsoftの属性を尊重するオプションを追加する一方で、期待されるパフォーマンスの向上を得ることができます。
エリック

@ericはい、そうですが、ほとんどの状況ではNewtonsoftのパフォーマンスで十分です。
Mohammad Olfatmiri

0

これは役に立ちます

public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers().AddJsonOptions(options=> {  options.JsonSerializerOptions.PropertyNamingPolicy = null;
                 options.JsonSerializerOptions.DictionaryKeyPolicy = null;

            });

            services.AddDbContext<PaymentDetailContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DevConnection")));
        }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.