Bagaimana cara mengatur pengaturan serialson json di asp.net core 3?

29

pengaturan serializer json untuk aplikasi inti warisan asp.net ditetapkan dengan menambahkan AddMvc().AddJsonOptions(), tapi saya tidak menggunakan AddMvc()di asp.net core 3. Jadi bagaimana saya bisa mengatur pengaturan serialisasi global json?

Alex Zaitsev
sumber
Jika Anda tidak menggunakan AddMvc, apa yang Anda gunakan? Apakah Anda menggunakan eg AddControllersatau Anda tidak menggunakan MVC sama sekali?
Kirk Larkin
@KirkLarkin saya menggunakan cara default untuk membangun aplikasi asp.net core 3 - app.UseEndpoints(endpoints => { endpoints.MapControllers() })danservices.AddControllers();
Alex Zaitsev
Baiklah, jadi saya kira Anda menggunakan AddControllersdi ConfigureServices, kan?
Kirk Larkin
@KirkLarkin, ya, benar
Alex Zaitsev

Jawaban:

27

AddMvcmengembalikan IMvcBuilderimplementasi, yang memiliki AddJsonOptionsmetode ekstensi yang sesuai . Metode gaya baru AddControllers, AddControllersWithViewsdan AddRazorPagesjuga mengembalikan IMvcBuilderimplementasi. Rantai dengan ini dengan cara yang sama Anda akan rantai dengan AddMvc:

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

Perhatikan bahwa di optionssini bukan lagi untuk Json.NET, tetapi untuk System.Text.JsonAPI yang lebih baru . Jika Anda masih ingin menggunakan Json.NET, lihat jawaban tymtam

Kirk Larkin
sumber
Menambahkan "options.JsonSerializerOptions.IgnoreNullValues ​​= true;" tidak berpengaruh
zion
1
Kepada orang lain yang membuka halaman ini mencari konversi Enum: [JsonConverter (typeof (JsonStringEnumConverter))] publik enum SomeEnum
Rafał Praniuk
23

Opsi A. AddControllers

Ini masih MVC, dan membutuhkan paket nuget Microsoft.AspNetCore.Mvc.NewtonsoftJson, tetapi Anda mengatakan Anda menggunakannya AddControllers.

Dari Tambahkan dukungan format JSON berbasis Newtonsoft.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());
});

Opsi B. Pengaturan Default

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

Properti JsonConvert.DefaultSettings

Mendapat atau menetapkan fungsi yang membuat JsonSerializerSettings default. Pengaturan default secara otomatis digunakan oleh metode serialisasi pada JsonConvert, dan ToObject () dan FromObject (Object) pada JToken. Untuk membuat cerita bersambung tanpa menggunakan pengaturan default apa pun, buat JsonSerializer dengan Create ().

tymtam
sumber
Hai, ini menetapkan pengaturan pada tingkat Json.NET, bagaimana bisa dilakukan pada tingkat ASP.NET?
Alex Zaitsev
Ini mengkonfigurasi pengaturan pada tingkat ASP.NET, yang berarti ModelBinding standar sekarang terjadi menggunakan serializer NewtonsoftJson.
MrClan
Terima kasih, Opsi A bekerja untuk saya. Ditingkatkan dari 2,2 menjadi 3,1 dan titik akhir saya rusak karena System.Text.Jsontidak menangani polimorfisme atau enum dengan benar. Cara mudah yang menyenangkan untuk mengubah serializer default.
static_void
15

Menambahkan Newtonsoft tidak perlu, cukup masalah dengan menambahkan paket kompatibilitas Newtonsoft pada proyek .Net Core 3.0.

Lihat juga https://github.com/aspnet/AspNetCore/issues/13564

Tentu saja, orang akan merayakan penamaan properti PascalCase, NA saat ini ... Jadi nulluntuk PropertyNamingPolicyPascalCase berarti, yang jelas tidak terlalu baik.

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