在asp.net core 3.1中,使用新的System.Text.Json,我试图在appsettings部分上使用自定义JsonConverter。手动序列化/反序列化可以正常地使用转换器,但是通过Options模式从appSettings读取时则不能。以下是我的代码:
JsonConverter,为简单起见,此代码将字符串值转换为大写:
当我将
有人知道如何让appsettings/options模式尊重JsonConverter吗?我需要在其他地方声明JsonSerializerOptions吗?谢谢。
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\"}")
,我会得到一个大写字符串,即使我删除了Startup中对JsonSerializerOptions的声明。有人知道如何让appsettings/options模式尊重JsonConverter吗?我需要在其他地方声明JsonSerializerOptions吗?谢谢。
appsettings.json
不是特殊文件,只是使用其中一个可用配置提供程序加载设置的约定名称。JSON提供程序使用特定格式加载设置,文档中有描述。所有设置,无论来源(json、ini、数据库、环境),都存储为键/值对。 - Panagiotis KanavosJsonSerializer.Deserialize
,因为正如你所指出的那样,它不需要,它只是用于创建键值对。相反,它调用JsonDocument.Parse
来完成这项工作。感谢您的帮助。 - edhenn