Як глобально встановити параметри за замовчуванням для System.Text.Json.JsonSerializer?


12

ОНОВЛЕННЯ [2019-12-23]: Частково завдяки голосовому внесенню спільноти ця проблема була додана до дорожньої карти для .NET 5.0.

ОНОВЛЕННЯ [2019-10-10]: Якщо ви зацікавлені в тому, щоб ця поведінка була реалізованоюSystem.Text.Json.JsonSerializerперейдіть до відкритого випуску GitHub, на який вказував Кріс Юнгманн, і зважте.


Замість цього:

JsonSerializerOptions options = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase
    // etc.
};
JsonSerializer.Deserialize<SomeObject>(someJsonString, options);

Я хотів би зробити щось подібне:

// This property is a pleasant fiction
JsonSerializer.DefaultSettings = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase
    // etc.
};

// This uses my options
JsonSerializer.Deserialize<SomeObject>(someJsonString); 

// And somewhere else in the same codebase...
// This also uses my options
JsonSerializer.Deserialize<SomeOtherObject>(someOtherJsonString); 

Сподіваємось, що не доведеться здавати екземпляр JsonSerializerOptionsдля наших найпоширеніших випадків, а замінити виняток, а не правило.

Як зазначено в цьому питанні, це корисна особливість Json.Net. Я подивився в документації на System.Text.Jsonяк це GitHub репо для .NET Core. І цей .

Здається, не існує аналога для керування за замовчуванням серіалізації JSON у .NET Core 3. Або я його не помічаю?


There doesn't seem to be an analog for managing JSON serialization defaults in Core-3- Ви говорите про запити в API та з нього? чи запити та відповіді на інші ресурси?
ps2goat

@ ps2goat Я не впевнений, що розумію ваше запитання. Тут справа (де) серіалізація рядків JSON. Вони могли надходити з будь-якої кількості джерел.
Тревор Рейд

Я запитав, тому що під час запуску є спеціальні місця для форматів вводу та виводу (наприклад, для прив'язки моделі)
ps2goat

Ах, готча. У цьому сенсі я думаю, що наш випадок потрапить до "інших ресурсів". @ ps2goat
Тревор Рейд

Це дуже сумно, до .net core 3.1, ще не було гарного вбудованого серіалізатора json.
Жарт Хуан

Відповіді:


4

Ні, JsonSerializerOptionsне виставляє параметрів за замовчуванням . Якщо ви використовуєте певний веб-фреймворк, можливо, через це можна вказати (де-) налаштування серіалізації. В іншому випадку я пропоную створити власні зручні методи.

Дивіться також це відкрите питання .


3

Можна створити метод розширення. Ось приклад

Я використовую окремі методи порівняно з тим, щоб будувати спеціальні налаштування, так що всі налаштування будуть в одному місці і легко використовуватись повторно.

public static class DeserializeExtensions
{
    private static JsonSerializerOptions defaultSerializerSettings = new JsonSerializerOptions();

    // set this up how you need to!
    private static JsonSerializerOptions featureXSerializerSettings = new JsonSerializerOptions();


    public static T Deserialize<T>(this string json)
    {       
        return JsonSerializer.Deserialize<T>(json, defaultSerializerSettings);
    }

    public static T DeserializeCustom<T>(this string json, JsonSerializerOptions settings)
    {
        return JsonSerializer.Deserialize<T>(json, settings);
    }

    public static T DeserializeFeatureX<T>(this string json)
    {
        return JsonSerializer.Deserialize<T>(json, featureXSerializerSettings);
    }
}

Потім ви називаєте це методом на рядку, будь то буквальним чи змінним.

    Car result = @"{""Wheels"": 4, ""Doors"": 2}".DeserializeFeatureX<Car>();

А, твій - це ще одна відповідь залежної від Json.Net, я думаю. Це питання стосується System.Text.Json.JsonSerializerв NET Core-3.0 без додаткових залежностей. Дякую.
Тревор Рейд

2
Ось така краса абстракції. Жодних змін коду за межами цього класу розширень! Я щойно оновив до вбудованого System.Text.Json.JsonSerializer. Концепція була точно такою ж. Я також оновив приклад посилання.
ps2goat

3

Параметри за замовчуванням не доступні JsonSerializerдля .NET Core 3.1. Однак станом на грудень 2019 року це було додано до дорожньої карти на 5,0.

Випуск .NET 5.0 очікується в листопаді 2020 року. Але немає гарантій, що ця конкретна проблема буде вирішена в будь-який конкретний час. Окрім того, як чекати, ці відповіді пропонують вирішити:


2

Обхідний шлях був запропонований GitHub користувача André-SS6 наступним чином :

((JsonSerializerOptions)typeof(JsonSerializerOptions)
    .GetField("s_defaultOptions", 
        System.Reflection.BindingFlags.Static |
        System.Reflection.BindingFlags.NonPublic).GetValue(null))
    .PropertyNameCaseInsensitive = true;

-1

(Якщо ви коли-небудь переходите на використання Json.NET)

Я віддаю перевагу і рекомендую бути явним і передавати параметри для всіх викликів, але ви можете встановити за замовчуванням з DefaultSettings .

JsonConvert.DefaultSettings = () => MySuperJsonSerializerSettings;

і потім

var json = JsonConvert.SerializeObject(o1);
var o2 = JsonConvert.DeserializeObject(x);

Ця відповідь і посилання від @tymtam стосується Json.Net. Це питання стосується поведінки simialr, в System.Text.Jsonякій серіалізація JSON закладена в .NET Core 3.0. Дякуємо, що знайшли час для відповіді.
Тревор Рейд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.