Куди зайшов IMvcBuilder AddJsonOptions .Net Core 3.0?


119

Я щойно оновив свій проект веб-API ASP. Net core 2.0до 3.0. Я використовував

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

попередньо для забезпечення нижнього кожуха серіалізованого JSON.

Після оновлення до 3.0 я отримую цю помилку:

Помилка CS1061 "IMvcBuilder" не містить визначення для "AddJsonOptions" і не може бути знайдено доступного методу розширення "AddJsonOptions", що приймає перший аргумент типу "IMvcBuilder" (ви не використовуєте директиву чи посилання на збірку?)

Відповідно до AddJsonOptions для MvcJsonOptions в Asp.Net Core 2.2 метод розширення AddJsonOptions є / був наданий нульовим пакетом Microsoft.AspNetCore.Mvc.Formatters.Json . Я спробував встановити / перевстановити це, але все ще не можу вирішити метод. Цікаво, що інтелігенція показує лише Microsoft.AspNetCore.Mvc.Formatters. Xml, коли я намагаюся додати оператор use, хоча я додав пакунок нута Json .

Якісь ідеї, що відбувається? Документація для AddJsonOptions тільки підходить до .Net 2.2 , так , можливо , цей метод є застарілим в 3.0 на користь якого - або іншого механізму конфігурації?

Відповіді:


203

Як частина ASP.NET Core 3.0, команда відмовилася від включення Json.NET за замовчуванням. Більше про це ви можете прочитати загалом у повідомленні про порушення змін у Microsoft.AspNetCore.App .

Замість Json.NET, ASP.NET Core 3.0 та .NET Core 3.0 включають інший API JSON, який трохи більше фокусується на продуктивності. Про це можна дізнатися більше в оголошенні про "Майбутнє JSON в .NET Core 3.0" .

Нові шаблони для ASP.NET Core більше не будуть поєднуватися з Json.NET, але ви можете легко налаштувати проект, щоб використовувати його замість нової бібліотеки JSON. Це важливо як для сумісності зі старими проектами, так і тому, що нова бібліотека не повинна бути повноцінною заміною, тому ви не побачите повний набір функцій там.

Для того, щоб переконфігурувати проект ASP.NET Core 3.0 з Json.NET, вам потрібно буде додати посилання NuGet Microsoft.AspNetCore.Mvc.NewtonsoftJson, що є пакетом, який включає всі необхідні біти. Потім, у запуску ConfigureServices, вам потрібно буде налаштувати MVC таким чином:

services.AddControllers()
    .AddNewtonsoftJson();

Це налаштовує контролери MVC і налаштовує його на використання Json.NET замість цього нового API. Замість контролерів ви також можете використовувати інше перевантаження MVC (наприклад, для контролерів із переглядами або сторінок Razor). Цей AddNewtonsoftJsonметод має перевантаження, що дозволяє налаштувати параметри Json.NET, як раніше ви використовувались AddJsonOptionsв ASP.NET Core 2.x.

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

41
Для тих, хто йде вдома ... під час міграції проекту вам може знадобитися додати чітке посилання на "Microsoft.AspNetCore.Mvc.NewtonsoftJson", щоб отримати розширення "AddNewtonsoftJson". На момент написання цього потрібно перевірити "включити попередні випуски", якщо ви використовуєте менеджер Visual Studio Nuget.
NeilMacMullen

1
Зауважте, що я, як правило, поки не рекомендую переходити на ASP.NET Core 3 за допомогою реальних програм. Якщо ви просто хочете пограти, впевнено, але перед остаточним випуском ще є кілька рухомих бітів, тому вам доведеться пам’ятати про це, якщо ви хочете перейти до нього рано.
ткнути

1
Це може викликати "Синхронні операції заборонені", перевірити stackoverflow.com/questions/47735133/… для отримання додаткової інформації
verbedr

8
Для мене AddNewtonsoftJsonвідсутня навіть після посилання на цю Microsoft.AspNetCore.Mvc.NewtonsoftJsonпосилання.
Саїд Неаматі

2
@avenmore Новий серіалізатор використовує окремий набір атрибутів. Ви можете використовувати [JsonIgnore]з System.Text.Json.Serializationпростору імен.
ткнути

21

Це працювало для мене, використовуючи .Net Core 3:

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

Я б припустив, що лінія повинна бути такою:o.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
Grandizer

1
Так, я теж, але це не так. Ця відповідь працювала і для мене.
Мартін

2
Не потрібно o.JsonSerializerOptions.DictionaryKeyPolicy = null;іo.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
Шахар Шокрані

Я б хотів використати цю відповідь, але моя програма була побудована за допомогою атрибутів Newtonsoft, які новий серіалізатор MS ігнорує, це означає, що я повинен продовжувати використовувати серіалізатор Newtonsoft з AddNewtonsoftJson. Можливо, MS може додати можливість поважати атрибути Newtonsoft, отримуючи при цьому підвищення ефективності, яку вони обіцяють.
Ерік

@eric Так, ви маєте рацію, але для більшості ситуацій вистачає продуктивності Newtonsoft.
Мохаммед Ольфатмірі

0

Це допомогло б

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")));
        }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.