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

12

ОБНОВЛЕНИЕ [2019-12-23]: Отчасти благодаря участию вокального сообщества эта проблема была добавлена ​​в дорожную карту для .NET 5.0.

ОБНОВЛЕНИЕ [2019-10-10]: Если интересно посмотреть, как это поведение реализовано дляSystem.Text.Json.JsonSerializerна голову к открытому вопросу GitHub указал Крис Yungmann и весят.


Вместо этого:

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. И этот .

В .NET Core 3 не существует аналога для управления значениями по умолчанию для сериализации JSON. Или я пропускаю это?

Тревор Рейд
источник
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>();
ps2goat
источник
Ах, ваш другой ответ Json.Net, я думаю. Этот вопрос о System.Text.Json.JsonSerializerNET 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
источник
Этот ответ и ссылка @tymtam относится к Json.Net. Этот вопрос касается поведения simialr, при System.Text.Jsonкотором сериализация JSON встроена в .NET Core 3.0. Спасибо что нашли время ответить.
Тревор Рейд