JSON özellikleri artık ASP .Net Core 1.0.0-rc2-final'den 1.0.0'a değiştirildiğinde küçük harf


92

Projemizi ASP .Net Core 1.0.0-rc2-final'den 1.0.0'a değiştirdim. JSON özelliklerinin büyük harf kullanımı nedeniyle web sitemiz ve müşterimiz çalışmayı durdurdu. Örneğin, bu JavaScript satırı artık başarısız oluyor

for (var i = 0; i < collection.Items.length; i++){

çünkü denetleyici artık "Öğeler" yerine "öğeler" dizisini çağırır. Güncellenen paketleri yüklemenin ve project.json dosyasını düzenlemenin dışında hiçbir değişiklik yapmadım. Özelliklerinin büyük harfle yazıldığı C # model dosyalarını değiştirmedim.

ASP.Net Core denetleyicileri neden daha düşük kasa özellikli JSON döndürmeye başladı? Modelden mülkiyet adlarının durumunu onurlandırmak için onlara nasıl geri dönebilirim?



2
Net Core 3'ün cevabını arayanlar için sayfanın en altına kaydırmanız gerekir.
Mike Devenney

Yanıtlar:


159

MVC artık JSON'u varsayılan olarak deve durum adlarıyla seri hale getiriyor

Varsayılan olarak deve vaka adlarından kaçınmak için bu kodu kullanın

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

Kaynak: https://github.com/aspnet/Announcements/issues/194


8
netcore2: Newtonsoft.Json.Serialization'ı kullanma;
david.barkhuizen

3
Tüm JSON serileştirmemi değiştirmek istemiyorum , yalnızca bazı üçüncü taraf yazılımların davranışına uyması gereken belirli bir durum. Json()Çağrının ikinci parametresinde doğru serileştirme ayarları nasıl sağlanır ?
Auspex

82

Bunu Google'dan bulmanız ve Core 3 için bir çözüm aramanız durumunda.

Core 3 System.Text.Json, varsayılan olarak durumu korumayan kullanır . Bu GitHub sorununda belirtildiği gibi , PropertyNamingPolicynull olarak ayarlamak sorunu çözecektir.

public void ConfigureServices(IServiceCollection services)
{
...
    services.AddControllers()
            .AddJsonOptions(opts => opts.JsonSerializerOptions.PropertyNamingPolicy = null);

ve genel ayarları değiştirmek istemiyorsanız, yalnızca bir eylem için şu şekildedir:

return Json(obj, new JsonSerializerOptions { PropertyNamingPolicy = null });

8
sen benim efendim ve kurtarıcımsın
Jonty Morris

1
Bu benim için Core 3.1'de iyi çalıştı. Kendo bileşenlerimin düzgün çalışmasını sağlayamadım ve json'un deve kasası formatlı olduğunu buldum. Bu sorunu çözdü.
Waragi

Ben de senin
konunum


10

Core 3.1'e geçiş yapanlar ve Core MVC projesine sahip olanlar için Startup.cs'de aşağıdaki kurulum kodunu kullanabilir:


        public void ConfigureServices(IServiceCollection services)
        {
            ...
            services.AddControllersWithViews().AddJsonOptions(opts => opts.JsonSerializerOptions.PropertyNamingPolicy = null);
            ...
        }

Bu, önceki bir yanıtla aynıdır stackoverflow.com/a/58187836/125981
Mark Schultheiss

@MarkSchultheiss, cevabım diğerlerine benzediği için muhtemelen haklısınız, ancak MVC görünümleri kullanan proje tipime göre doğru cevabı ararken projemle eşleşen tam cevabı bulamadım. AddControllersWithViews () bu eksik parçayı ekler ve bunun gelecekte herkes için yararlı olacağını düşündüm. Yorumunuz için yine de teşekkürler!
UY

3

Bu, onu dotnet core 3 webapi'de düzeltir, böylece mülk adlarınızı hiç değiştirmez ve müşterinize tam olarak istediğiniz gibi geri dönersiniz.

Startup.cs içinde:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers().AddJsonOptions(options => options.JsonSerializerOptions.PropertyNamingPolicy = null);
        services.AddHttpClient();
    }

Bu, önceki bir yanıtla aynıdır stackoverflow.com/a/58187836/125981
Mark Schultheiss

1

ASP.net WEB API (ASP.NET Core yerine) kullanan biri için.

Bu satırı WebApiConfig'inize ekleyin.

//Comment this jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

jsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver();

Bunu bir cevap olarak buraya eklemek, çünkü bu, web api için google aramada da ilk sırada geliyor.


0

Core 2.x sürümleri için, bu kodu kullanarak deve kasa adlarından varsayılan olarak kaçınabilirsiniz. Startup.cs dosyasının ConfigureServices yöntemine aşağıdaki kodu eklemeniz gerekir.

services.AddMvc()
.AddJsonOptions(o =>
{
    if (o.SerializerSettings.ContractResolver != null)
    {
        var castedResolver = o.SerializerSettings.ContractResolver
        as DefaultContractResolver;

        castedResolver.NamingStrategy = null;
    }
});

0

Global olarak ayarlamak istemeyen biri için, Json sonucu olarak geri dönmek için ContractResolver'ı kullanmak da mümkündür:

public IActionResult MyMethod()
{
    var obj = new {myValue = 1};
    return Json(obj, new JsonSerializerSettings {ContractResolver = new DefaultContractResolver()});
}
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.