Властивості JSON тепер мають нижній регістр для обміну з ASP .Net Core 1.0.0-rc2-final на 1.0.0


90

Я щойно замінив наш проект з ASP .Net Core 1.0.0-rc2-final на 1.0.0. Наш веб-сайт і клієнт перестали працювати через використання великих літер властивостей JSON. Наприклад, цей рядок JavaScript тепер не працює

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

оскільки контролер тепер називає масив "items" замість "Items". Я не вніс жодних змін, окрім встановлення оновлених пакетів та редагування файлу project.json. Я не міняв файли моделі C #, які все ще пишуть свої властивості.

Чому контролери ASP.Net Core почали повертати JSON із нижчими літерами? Як я можу повернутися до них, вшановуючи справу назв властивостей із моделі?



2
Тим, хто шукає відповідь на .Net Core 3, потрібно прокрутити вниз до кінця сторінки.
Mike Devenney

Відповіді:


156

Тепер MVC за замовчуванням серіалізує JSON із назвами випадків верблюдів

Використовуйте цей код, щоб уникнути імен випадків верблюдів за замовчуванням

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

Джерело: https://github.com/aspnet/Announcements/issues/194


8
netcore2: використання Newtonsoft.Json.Serialization;
david.barkhuizen

3
Я не хочу змінювати всю свою серіалізацію JSON, лише один конкретний випадок, який повинен відповідати поведінці деяких сторонніх програм. Як забезпечити правильні налаштування серіалізації у другому параметрі Json()дзвінка?
Auspex

79

Якщо ви знайшли це від Google і шукаєте рішення для Core 3.

Core 3 використовує System.Text.Json, що за замовчуванням не зберігає регістр. Як згадувалось у цій проблемі з GitHub , встановлення значення PropertyNamingPolicynull вирішить проблему.

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

і якщо ви не хочете змінювати загальні налаштування, лише для однієї дії це так:

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

8
ти мій лорд і рятівник
Джонті Морріс

1
Для мене це добре працювало на Core 3.1. Я не зміг змусити мої компоненти kendo працювати належним чином і виявив, що json відформатований у випадку верблюда. Це вирішило проблему.
Варагі

Я також ваша тема
Жоау Лурейру,


9

Для тих, хто перейшов на Core 3.1 і має проект Core MVC, можна використовувати наступний код налаштування в Startup.cs:


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

Це те саме, що попередня відповідь stackoverflow.com/a/58187836/125981
Марк Шультхайс

@MarkSchultheiss ти, мабуть, маєш рацію, оскільки моя відповідь схожа на всі інші, однак, коли я шукав правильну відповідь на основі типу мого проекту, а саме MVC, що використовує погляди, я не знайшов точної відповіді, яка відповідає моєму проекту. AddControllersWithViews () додає ці відсутні фрагменти, і я вважав, що це буде корисно для всіх у майбутньому. Хоча дякую за ваш коментар!
UY

3

Це виправить у dotnet core 3 webapi, так що воно взагалі не змінить назви ваших властивостей, і ви повернете клієнту саме те, що ви задумали.

У Startup.cs:

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

Це те саме, що попередня відповідь stackoverflow.com/a/58187836/125981
Марк Шультхайс

1

Для когось, хто використовує веб-API ASP.net (а не ASP.NET Core).

Додайте цей рядок у свій WebApiConfig.

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

jsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver();

Додавши це як відповідь тут, оскільки це також з’являється першим у пошуку Google для веб-API.


0

У версіях Core 2.x, використовуючи цей код, ви можете уникати імен верблюдів за замовчуванням. Вам потрібно додати наступний код всередину методу ConfigureServices файлу Startup.cs.

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

        castedResolver.NamingStrategy = null;
    }
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.