Asp. Net Настройки приложения Core 3.1 не соответствуют JsonConverter - PullRequest
0 голосов
/ 09 июля 2020

В asp. net core 3.1, используя новый System.Text. Json, я пытаюсь использовать собственный JsonConverter в разделе настроек приложения. Ручная сериализация / десериализация отлично учитывает конвертер, но чтение из appSettings через шаблон параметров - нет. Вот что у меня есть:

JsonConverter. Для простоты этот просто преобразует строковое значение в верхний регистр:

    public class UpperConverter : JsonConverter<string>
    {
        public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) =>
            reader.GetString().ToUpper();

        public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options) =>
            writer.WriteStringValue(value == null ? "" : value.ToUpper());
    }

Класс appsettings, объявляющий преобразователь в строковом свойстве:

    public class MyOptions
    {
        public const string Name = "MyOptions";
        [JsonConverter(typeof(UpperConverter))]
        public string MyString { get; set; }
    }

Startup.cs изменяется для подготовки все:

       public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews()
                .AddJsonOptions(options =>
                {
                    options.JsonSerializerOptions.Converters.Add(new UpperConverter());
                });

            services.Configure<MyOptions>(Configuration.GetSection(MyOptions.Name));
        }

Когда я вставляю IOptions<MyOptions> в HomeController, он считывает значение в нижнем регистре. Если я вручную сделаю JsonSerializer.Deserialize<MyOptions>("{\"MyString\":\"lowercase_manual\"}"), я получу строку в верхнем регистре. Даже когда я удаляю объявления запуска JsonSerializerOptions.

Кто-нибудь знает, как заставить шаблон appsettings / options уважать JsonConverter? Должен ли я объявить JsonSerializerOptions где-нибудь еще? Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...