Как установить настройки сериализатора 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 ().


Привет, это устанавливает параметры на уровне 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;
        });
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.