IMvcBuilder AddJsonOptions .Net Core 3.0'da nereye gitti?


119

ASP web API projemi. Net core 2.0için 3.0. Kullanıyordum

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

daha önce serileştirilmiş JSON'un alt harf kullanımını sağlamak için.

3.0'a yükselttikten sonra şu hatayı alıyorum:

Hata CS1061 'IMvcBuilder', 'AddJsonOptions' için bir tanım içermiyor ve 'IMvcBuilder' türündeki ilk bağımsız değişkeni kabul eden erişilebilir uzantı yöntemi 'AddJsonOptions' bulunamadı (bir kullanma yönergesini veya bir derleme başvurusunu kaçırıyor musunuz?)

Asp.Net Core 2.2'deki AddJsonOptions for MvcJsonOptions'a göre , AddJsonOptions genişletme yöntemi Microsoft.AspNetCore.Mvc.Formatters.Json nuget paketi tarafından sağlanmıştır . Bunu yüklemeyi / yeniden yüklemeyi denedim ancak yine de yöntemi çözemiyorum. İlginç bir şekilde, intellisense yalnızca Microsoft.AspNetCore.Mvc.Formatters'ı gösterir. Json nuget paketini eklememe rağmen, using ifadesini eklemeye çalıştığımda Xml .

Ne olduğuna dair herhangi bir fikir var mı? Dokümantasyon için AddJsonOptions tek yöntem bazı diğer yapılandırma mekanizması lehine 3.0 önerilmemektedir olmuştur belkide .Net 2.2 kadar çıkıyor?

Yanıtlar:


203

ASP.NET Core 3.0'ın bir parçası olarak ekip, varsayılan olarak Json.NET'i dahil etmekten uzaklaştı. Microsoft.AspNetCore.App'deki değişiklikleri sonlandırma hakkındaki duyuruda genel olarak bununla ilgili daha fazla bilgi edinebilirsiniz .

Json.NET yerine ASP.NET Core 3.0 ve .NET Core 3.0, performansa biraz daha fazla odaklanan farklı bir JSON API içerir. ".NET Core 3.0'da JSON'un geleceği" hakkındaki duyuruda daha fazla bilgi edinebilirsiniz .

ASP.NET Core için yeni şablonlar artık Json.NET ile paketlenmeyecek, ancak projeyi yeni JSON kitaplığı yerine kullanmak üzere kolayca yeniden yapılandırabilirsiniz. Bu, hem eski projelerle uyumluluk hem de yeni kitaplığın tam bir ikame olmaması nedeniyle önemlidir, bu nedenle burada tam özellik setini göremezsiniz.

ASP.NET Core 3.0 projenizi Json.NET ile yeniden yapılandırmak için Microsoft.AspNetCore.Mvc.NewtonsoftJson, gerekli tüm bitleri içeren paket olan bir NuGet başvurusu eklemeniz gerekir . Ardından, Başlangıç'ta, MVC'yi şu ConfigureServicesşekilde yapılandırmanız gerekecektir:

services.AddControllers()
    .AddNewtonsoftJson();

Bu, MVC denetleyicilerini ayarlar ve bu yeni API yerine Json.NET kullanacak şekilde yapılandırır. Denetleyiciler yerine, farklı bir MVC aşırı yüklemesi de kullanabilirsiniz (örneğin, görünümlere sahip denetleyiciler veya Razor sayfaları için). Bu AddNewtonsoftJsonyöntemin, AddJsonOptionsASP.NET Core 2.x'te alıştığınız gibi Json.NET seçeneklerini yapılandırmanıza izin veren bir aşırı yüklemesi vardır .

services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.ContractResolver = new DefaultContractResolver();
    });

41
Evde takip edenler için ... bir projeyi taşırken, "AddNewtonsoftJson" uzantısını almak için "Microsoft.AspNetCore.Mvc.NewtonsoftJson" öğesine bir nuget başvurusu eklemeniz gerekebilir. Bu, yazılırken Visual Studio Nuget yöneticisini kullanıyorsanız "ön sürümleri dahil et" seçeneğinin kontrol edilmesini gerektirir.
NeilMacMullen

1
Henüz gerçek uygulamalarla ASP.NET Core 3'e geçiş yapmanızı önermediğimi unutmayın. Sadece etrafta oynamak istiyorsanız, elbette, ancak son sürümden önce hala birkaç hareketli bit var, bu yüzden erken geçmek istiyorsanız bunu aklınızda bulundurmanız gerekecek.
dürtmek

1
Bu, "Eşzamanlı işlemlere izin verilmediğini" tetikleyebilir , daha fazla bilgi için stackoverflow.com/questions/47735133/… 'yi kontrol edin
verbedr

8
Bu AddNewtonsoftJsonreferansa Microsoft.AspNetCore.Mvc.NewtonsoftJsonatıfta bulunduktan sonra bile benim için eksik .
Saeed Neamati

2
@avenmore Yeni serileştirici, ayrı bir öznitelik kümesi kullanır. Sen kullanabilirsiniz [JsonIgnore]gelen System.Text.Json.Serializationad.
dürtmek

21

Bu, kullanırken benim için çalıştı .Net Core 3:

services.AddMvc().AddJsonOptions(o =>
{
    o.JsonSerializerOptions.PropertyNamingPolicy = null;
    o.JsonSerializerOptions.DictionaryKeyPolicy = null;
});

Çizginin şu şekilde olması gerektiğini varsayıyorum:o.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
Grandizer

1
Evet ben de ama öyle değil. Bu cevap benim için yine de çalıştı.
Martin

2
Gerek yok o.JsonSerializerOptions.DictionaryKeyPolicy = null;veo.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
Shahar Shokrani

Keşke bu yanıtı kullanabilseydim, ancak uygulamam Newtonsoft öznitelikleri kullanılarak oluşturuldu, bu yeni MS serileştiricinin görmezden geldiği, yani AddNewtonsoftJson ile Newtonsoft serileştiriciyi kullanmaya devam etmem gerektiği anlamına geliyor. Belki MS, umut vaat ettikleri performans kazanımlarını elde ederken, Newtonsoft özelliklerine saygı duymak için bir seçenek ekleyebilir.
Eric

@eric Evet haklısınız ama Newtonsoft performansı çoğu durumda yeterli.
Mohammad Olfatmiri

0

Bu yardımcı olur

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")));
        }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.