在 asp.net core 3.1 中,使用新的 System.Text.Json,我试图在 appsettings 部分使用自定义 JsonConverter。手动序列化/反序列化可以很好地尊重转换器,但通过选项模式从 appSettings 读取则不行。这是我所拥有的:
Json 转换器。为简单起见,这只是将字符串值转换为大写:
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 吗?谢谢。