Как установить настройки сериализатора json в asp.net core 3?

29

Настройки сериализатора json для устаревших основных приложений asp.net были установлены путем добавления AddMvc().AddJsonOptions(), но я не использую AddMvc()в asp.net core 3. Итак, как я могу установить глобальные настройки сериализации JSON?

Алекс Зайцев
источник
Если вы не используете AddMvc, то , что делать вы используете? Вы используете, например, AddControllersили вы просто не используете MVC вообще?
Кирк Ларкин
@KirkLarkin Я использую стандартный способ создания приложения asp.net core 3 - app.UseEndpoints(endpoints => { endpoints.MapControllers() })иservices.AddControllers();
Алекс Зайцев
Хорошо, так что я предполагаю , что вы используете AddControllersв ConfigureServices, верно?
Кирк Ларкин
@KirkLarkin, да, верно
Алекс Зайцев

Ответы:

27

AddMvcвозвращает IMvcBuilderреализацию, у которой есть соответствующий AddJsonOptionsметод расширения. Методы нового стиля AddControllers, AddControllersWithViewsи AddRazorPagesтакже возвращают IMvcBuilderреализацию. Цепочка с ними так же, как с цепью AddMvc:

services.AddControllers()
    .AddJsonOptions(options =>
    {
        // ...
    });

Обратите внимание, что optionsздесь больше не для Json.NET, а для более новых System.Text.JsonAPI. Если вы все еще хотите использовать Json.NET, посмотрите ответ Tymtam

Кирк Ларкин
источник
Добавление "options.JsonSerializerOptions.IgnoreNullValues ​​= true;" ничего не
дало
1
Для тех, кто зашел на эту страницу в поисках преобразования Enum: [JsonConverter (typeof (JsonStringEnumConverter))] public enum SomeEnum
Rafał Praniuk
23

Вариант А. AddControllers

Это по-прежнему MVC, и для него требуется пакет nuget Microsoft.AspNetCore.Mvc.NewtonsoftJson, но вы сказали, что используете AddControllers.

Из добавления поддержки формата JSON на основе Newtonsoft.Json

services.AddControllers().AddNewtonsoftJson(options =>
{
    // Use the default property (Pascal) casing
    options.SerializerSettings.ContractResolver = new DefaultContractResolver();

    // Configure a custom converter
    options.SerializerOptions.Converters.Add(new MyCustomJsonConverter());
});

Вариант Б. Настройки по умолчанию

JsonConvert.DefaultSettings = () => new JsonSerializerSettings (...)

Свойство JsonConvert.DefaultSettings

Получает или задает функцию, которая создает JsonSerializerSettings по умолчанию. Настройки по умолчанию автоматически используются методами сериализации в JsonConvert, а также ToObject () и FromObject (Object) в JToken. Для сериализации без использования настроек по умолчанию создайте JsonSerializer с Create ().

tymtam
источник
Привет, это устанавливает параметры на уровне Json.NET, как это можно сделать на уровне ASP.NET?
Алексей Зайцев
Он настраивает параметры на уровне ASP.NET, то есть привязка ModelBinding по умолчанию теперь выполняется с помощью сериализатора NewtonsoftJson.
MrClan
Спасибо, вариант А сработал для меня. Обновлен с 2.2 до 3.1, и моя конечная точка сломалась, потому System.Text.Jsonчто неправильно обрабатывает полиморфизм или перечисления. Хороший простой способ изменить сериализатор по умолчанию.
static_void
15

Добавлять Newtonsoft не нужно, достаточно проблем с добавлением пакетов совместимости Newtonsoft в проект .Net Core 3.0.

Смотрите также https://github.com/aspnet/AspNetCore/issues/13564

Конечно, можно отметить именование свойств PascalCase, NA в данный момент ... Так что nullдля PropertyNamingPolicyсредств PascalCase, что, очевидно, не очень хорошо.

// Pascal casing
services.AddControllersWithViews().
        AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
            options.JsonSerializerOptions.PropertyNamingPolicy = null;
        });
OSP
источник