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?


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



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 ().


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;
        });
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.