Як встановити параметри серіалізатора json в ядрі 3 asp.net?


29

Налаштування Serializer для 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))] громадський переписник SomeEnum
Рафал Пранюк

23

Варіант А. AddControllers

Це все ще MVC і вимагає Microsoft.AspNetCore.Mvc.NewtonsoftJson nuget пакет, але ви сказали, що використовуєте 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());
});

Варіант B. Налаштування за замовчуванням

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

Властивість JsonConvert.DefaultSettings

Отримує або встановлює функцію, яка створює JsonSerializerSettings за замовчуванням. Установки за замовчуванням автоматично використовуються методами серіалізації на JsonConvert, а також на ToObject () та FromObject (Object) на JToken. Для серіалізації без використання налаштувань за замовчуванням створіть JsonSerializer за допомогою Create ().


Привіт, це встановлює налаштування на рівні Json.NET, як це можна зробити на рівні ASP.NET?
Олексій Зайцев

Він налаштовує налаштування на рівні ASP.NET, тобто за замовчуванням ModelBinding тепер відбувається за допомогою серіалізатора NewtonsoftJson.
MrClan

Дякую, Варіант A працював на мене. Оновлено з 2,2 до 3,1, і моя кінцева точка зламалася, оскільки System.Text.Jsonвона не справляється з поліморфізмом або не переживає належним чином. Хороший простий спосіб змінити серіалізатор за замовчуванням.
static_void

15

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

Дивіться також https://github.com/aspnet/AspNetCore/isissue/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.