Есть ли способ глобально установить параметры по умолчанию для System.Text.Json.JsonSerializer? - PullRequest
4 голосов
/ 11 октября 2019

ОБНОВЛЕНИЕ: Если вы хотите увидеть, как это поведение реализовано для 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 для Core. И этот .

Похоже, что нет аналога для управления значениями по умолчанию для сериализации JSON в Core-3. Или я это пропускаю?

Ответы [ 3 ]

3 голосов
/ 11 октября 2019

Нет, JsonSerializerOptions не предоставляет параметры по умолчанию . Если вы используете определенную веб-среду, может быть способ указать (де) настройки сериализации через это. В противном случае я предлагаю создать ваши собственные удобные методы.

См. Также этот открытый выпуск .

1 голос
/ 11 октября 2019

Вы можете создать метод расширения. Вот пример

Я использую отдельные методы против необходимости создавать специальные настройки, чтобы все настройки были в одном месте и легко использовались повторно.

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>();
0 голосов
/ 11 октября 2019

(Если вы когда-нибудь переключитесь на использование Json.NET)

Я предпочитаю и рекомендую быть явным и передавать настройки всем вызовам, но вы можете установить значения по умолчанию с помощью DefaultSettings .

JsonConvert.DefaultSettings = () => MySuperJsonSerializerSettings;

, а затем

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