web-dev-qa-db-ja.com

asp.netコア3でjsonシリアライザー設定を設定する方法

レガシーasp.netコアアプリケーションのjsonシリアライザー設定はAddMvc().AddJsonOptions()を追加することで設定されましたが、_asp.net core 3_でAddMvc()を使用していません。では、どうすればグローバルjsonシリアル化設定を設定できますか?

28
Alex Zaitsev

AddMvcは、対応する IMvcBuilder 拡張メソッドを持つ AddJsonOptions 実装を返します。新しいスタイルのメソッドAddControllersAddControllersWithViews、およびAddRazorPagesIMvcBuilder実装を返します。 AddMvcでチェーンするのと同じ方法で、これらをチェーンします。

services.AddControllers()
    .AddJsonOptions(options =>
    {
        // ...
    });

ここでのoptionsはJson.NETではなく、新しいSystem.Text.Json AP​​I。それでもJson.NETを使用したい場合は、 tymtamの回答 を参照してください。

19
Kirk Larkin

オプションA. AddControllers

これはまだMVCであり、Microsoft.AspNetCore.Mvc.NewtonsoftJson nugetパッケージが必要ですが、AddControllersを使用すると言っていました。

From Add Newtonsoft.Json-based JSON format support から

_services.AddControllers().AddNewtonsoftJson(options =>
{
    // Use the default property (Pascal) casing
    options.SerializerSettings.ContractResolver = new DefaultContractResolver();

    // Configure a custom converter
    options.SerializerOptions.Converters.Add(new MyCustomJsonConverter());
});
_

オプションB. DefaultSettings

JsonConvert.DefaultSettings = () => new JsonSerializerSettings (...)

JsonConvert.DefaultSettingsプロパティ

デフォルトのJsonSerializerSettingsを作成する関数を取得または設定します。デフォルト設定は、JsonConvertのシリアル化メソッド、およびJTokenのToObject()およびFromObject(Object)によって自動的に使用されます。デフォルト設定を使用せずにシリアル化するには、Create()でJsonSerializerを作成します。

17
tymtam

Newtonsoftを追加する必要はありません。NetCore 3.0プロジェクトにNewtonsoft互換性パッケージを追加することにはかなりの問題があります。

参照 https://github.com/aspnet/AspNetCore/issues/13564

もちろん、現時点ではPascalCase、NAという名前のプロパティを祝います...したがって、nullPropertyNamingPolicyはPascalCaseを意味しますが、明らかにあまり良くありません。

// Pascal casing
services.AddControllersWithViews().
        AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
            options.JsonSerializerOptions.PropertyNamingPolicy = null;
        });
9
OSP