Di mana IMvcBuilder AddJsonOptions masuk .Net Core 3.0?

119

Saya baru saja meningkatkan proyek API web ASP saya dari. Net core 2.0kepada 3.0. Saya menggunakan

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

sebelumnya untuk memastikan casing bawah JSON serial.

Setelah meningkatkan ke 3.0 saya mendapatkan kesalahan ini:

Kesalahan CS1061 'IMvcBuilder' tidak berisi definisi untuk 'AddJsonOptions' dan tidak ada metode ekstensi yang dapat diakses 'AddJsonOptions' yang menerima argumen pertama jenis 'IMvcBuilder' dapat ditemukan (apakah Anda kehilangan petunjuk penggunaan atau referensi assembly?)

Menurut AddJsonOptions untuk MvcJsonOptions di Asp.Net Core 2.2 metode ekstensi AddJsonOptions disediakan oleh paket nuget Microsoft.AspNetCore.Mvc.Formatters.Json . Saya telah mencoba menginstal / menginstal ulang ini tetapi masih tidak dapat menyelesaikan metode ini. Menariknya, intellisense hanya menampilkan Microsoft.AspNetCore.Mvc.Formatters. Xml ketika saya mencoba menambahkan pernyataan using meskipun saya menambahkan paket nuget Json .

apa yang sedang terjadi? The dokumentasi untuk AddJsonOptions hanya naik ke Net 2,2 jadi mungkin metode telah usang dalam 3.0 mendukung beberapa mekanisme konfigurasi lainnya?

NeilMacMullen
sumber

Jawaban:

203

Sebagai bagian dari ASP.NET Core 3.0, tim tersebut tidak lagi menyertakan Json.NET secara default. Anda dapat membaca lebih lanjut tentang itu secara umum di pengumuman tentang perubahan yang melanggar Microsoft.AspNetCore.App .

Alih-alih Json.NET, ASP.NET Core 3.0 dan .NET Core 3.0 menyertakan API JSON berbeda yang lebih berfokus pada kinerja. Anda dapat mempelajarinya lebih lanjut dalam pengumuman tentang "Masa depan JSON di .NET Core 3.0" .

Template baru untuk ASP.NET Core tidak lagi dipaketkan dengan Json.NET tetapi Anda dapat dengan mudah mengkonfigurasi ulang proyek untuk menggunakannya alih-alih perpustakaan JSON baru. Ini penting untuk kompatibilitas dengan project lama dan juga karena library baru tidak seharusnya menjadi pengganti penuh, jadi Anda tidak akan melihat fitur lengkap yang disetel di sana.

Untuk mengkonfigurasi ulang proyek ASP.NET Core 3.0 Anda dengan Json.NET, Anda perlu menambahkan referensi NuGet Microsoft.AspNetCore.Mvc.NewtonsoftJson, yang merupakan paket yang menyertakan semua bit yang diperlukan. Kemudian, di Startup ConfigureServices, Anda perlu mengkonfigurasi MVC seperti ini:

services.AddControllers()
    .AddNewtonsoftJson();

Ini menyiapkan pengontrol MVC dan mengonfigurasinya untuk menggunakan Json.NET, bukan API baru itu. Alih-alih pengontrol, Anda juga dapat menggunakan overload MVC yang berbeda (misalnya untuk pengontrol dengan tampilan, atau halaman Razor). Bahwa AddNewtonsoftJsonmetode memiliki kelebihan yang memungkinkan Anda untuk mengkonfigurasi opsi Json.NET seperti Anda digunakan untuk dengan AddJsonOptionsdi ASP.NET Inti 2.x.

services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.ContractResolver = new DefaultContractResolver();
    });
menyodok
sumber
41
Bagi mereka yang mengikuti di rumah ... saat memigrasi proyek Anda mungkin perlu menambahkan referensi nuget ke "Microsoft.AspNetCore.Mvc.NewtonsoftJson" untuk mendapatkan ekstensi "AddNewtonsoftJson". Pada saat penulisan ini memerlukan "sertakan prereleases" untuk diperiksa jika Anda menggunakan manajer Visual Studio Nuget.
NeilMacMullen
1
Perhatikan bahwa saya biasanya tidak akan merekomendasikan bermigrasi ke ASP.NET Core 3 dengan aplikasi nyata dulu. Jika Anda hanya ingin bermain-main, tentu saja, tetapi masih ada beberapa bagian yang bergerak sebelum rilis final, jadi Anda harus mengingatnya jika ingin pindah lebih awal.
aduk
1
Ini dapat memicu "Operasi sinkron tidak diizinkan", periksa stackoverflow.com/questions/47735133/… untuk info lebih lanjut
verbedr
8
Bagi saya AddNewtonsoftJsonhilang, bahkan setelah merujuk referensi itu Microsoft.AspNetCore.Mvc.NewtonsoftJson.
Saeed Neamati
2
@avenmore Penyambung baru menggunakan sekumpulan atribut terpisah. Anda dapat menggunakan [JsonIgnore]dari System.Text.Json.Serializationnamespace.
aduk
21

Ini berhasil untuk saya, saat menggunakan .Net Core 3:

services.AddMvc().AddJsonOptions(o =>
{
    o.JsonSerializerOptions.PropertyNamingPolicy = null;
    o.JsonSerializerOptions.DictionaryKeyPolicy = null;
});
Mohammad Olfatmiri
sumber
Saya akan berasumsi bahwa barisnya harus:o.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
Grandizer
1
Ya saya juga, tapi tidak. Jawaban ini berhasil untuk saya.
Martin
2
Tidak perlu o.JsonSerializerOptions.DictionaryKeyPolicy = null;dano.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
Shahar Shokrani
Saya berharap saya dapat menggunakan jawaban ini, tetapi aplikasi saya dibuat menggunakan atribut Newtonsoft, yang diabaikan oleh serializer MS baru, yang berarti saya harus terus menggunakan serializer Newtonsoft dengan AddNewtonsoftJson. Mungkin MS dapat menambahkan opsi untuk menghormati atribut Newtonsoft, sambil tetap mendapatkan peningkatan kinerja yang mereka janjikan.
Eric
@eric Ya Anda benar tetapi, kinerja Newtonsoft sudah cukup untuk sebagian besar situasi.
Mohammad Olfatmiri
0

Ini akan membantu

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")));
        }
Nirmala
sumber