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