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


29

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


あなたが使用していない場合はAddMvc、何をやる使用?あなたはegを使用AddControllersしていますか、それともMVCをまったく使用していませんか?
カークラーキン、

@KirkLarkin私はasp.netコア3アプリをビルドするデフォルトの方法を使用します- app.UseEndpoints(endpoints => { endpoints.MapControllers() })およびservices.AddControllers();
Alex Zaitsev

さてさて、私はあなたが使用していると思いますので、AddControllersConfigureServices右、?
カークラーキン、

@KirkLarkin、そうです、そうです
Alex Zaitsev

回答:


27

AddMvcIMvcBuilder対応するAddJsonOptions拡張メソッドを持つ実装を返します。新しいスタイルの方法は AddControllersAddControllersWithViewsAddRazorPagesにも復帰IMvcBuilderの実装を。あなたがチェーンするのと同じ方法でこれらとチェーンしAddMvcます:

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

optionsここでは、Json.NETではなく、新しいSystem.Text.JsonAPI が対象であることに注意してください。それでもJson.NETを使用したい場合は、tymtamの回答を参照してください



「options.JsonSerializerOptions.IgnoreNullValues = true;」を追加します 効果なし
ザイオン

1
[JsonConverter(typeof演算(JsonStringEnumConverter))]パブリック列挙SomeEnum:列挙型変換を探して、このページをヒット他の人に
ラファウPraniuk

23

オプションA. AddControllers

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

追加Newtonsoft.JsonベースのJSON形式のサポート

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を作成します。


こんにちは、これはJson.NETレベルで設定を設定します。ASP.NETレベルでどのように行うことができますか?
Alex Zaitsev

ASP.NETレベルで設定を構成します。つまり、NewtonsoftJsonシリアライザーを使用してデフォルトのModelBindingが実行されるようになりました。
MrClan

ありがとう、オプションAでうまくいきました。2.2から3.1にアップグレードすると、System.Text.Jsonポリモーフィズムまたは列挙型を適切に処理しないため、エンドポイントが機能しなくなりました。デフォルトのシリアライザーを変更する簡単な方法です。
static_void

15

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

https://github.com/aspnet/AspNetCore/issues/13564も参照してください

もちろん、PascalCase現時点ではNA という名前のプロパティを祝うことになるでしょう...つまりnullPropertyNamingPolicyPascalCase を意味しますが、これは明らかにあまり良くありません。

// Pascal casing
services.AddControllersWithViews().
        AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
            options.JsonSerializerOptions.PropertyNamingPolicy = null;
        });
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.