Куда делся 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» (отсутствует ли директива using или ссылка на сборку?)

Согласно AddJsonOptions для MvcJsonOptions в Asp.Net Core 2.2 метод расширения AddJsonOptions предоставляется / был предоставлен пакетом nuget Microsoft.AspNetCore.Mvc.Formatters.Json . Я попытался установить / переустановить это, но все еще не могу решить этот метод. Интересно, что intellisense показывает только Microsoft.AspNetCore.Mvc.Formatters. Xml, когда я пытаюсь добавить оператор using, хотя я добавил пакет Nuget Json .

Есть идеи, что происходит? Документация для AddJsonOptions только подходит к .Net 2.2 , так , возможно , этот метод является устаревшим в 3.0 в пользу какого - либо другого механизма конфигурации?

Ответы:


205

В рамках разработки ASP.NET Core 3.0 команда отказалась от включения Json.NET по умолчанию. Вы можете узнать больше об этом в объявлении о критических изменениях в Microsoft.AspNetCore.App .

Вместо Json.NET, ASP.NET Core 3.0 и .NET Core 3.0 включают другой JSON API, который больше ориентирован на производительность. Вы можете узнать об этом подробнее в объявлении «Будущее JSON в .NET Core 3.0» .

Новые шаблоны для ASP.NET Core больше не будут связаны с Json.NET, но вы можете легко перенастроить проект, чтобы использовать его вместо новой библиотеки JSON. Это важно как для совместимости со старыми проектами, так и потому, что новая библиотека не должна быть полной заменой, поэтому вы не увидите там полный набор функций.

Чтобы перенастроить проект ASP.NET Core 3.0 с помощью Json.NET, вам нужно будет добавить ссылку NuGet Microsoft.AspNetCore.Mvc.NewtonsoftJson, которая представляет собой пакет, который включает все необходимые биты. Затем в Startup 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
Для тех, кто следит за вами дома ... при миграции проекта вам может потребоваться добавить ссылку nuget на «Microsoft.AspNetCore.Mvc.NewtonsoftJson», чтобы получить расширение «AddNewtonsoftJson». На момент написания этого требует проверки «включить предварительные выпуски», если вы используете диспетчер Nuget Visual Studio.
NeilMacMullen

1
Обратите внимание, что я бы, как правило, не рекомендовал переходить на ASP.NET Core 3 с реальными приложениями. Если вы просто хотите поиграться, конечно, но до финального релиза еще есть несколько движущихся моментов, так что вам придется помнить об этом, если вы хотите перейти на него раньше.
совать

1
Это может вызвать
запуск

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.