В 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 где-нибудь еще? Спасибо.