在读取json设置文件的各个部分时,是否可以将.Net Core 3.1控制台应用程序配置为使用Newtonsoft.Json库反序列化IOptions <>(来自Microsoft.Extensions.Options)?]
public MyService(IOptions<MyAppDataSettings> MyAppDataOptions) { var myAppDataOptions = MyAppDataOptions?.Value ?? throw new ArgumentNullException(nameof(MyAppDataSettings)); }
结果不同于直接使用System.Text.Json反序列化时的结果:
var appJsonData = System.Text.Json.JsonSerializer.Deserialize<MyAppDataSettings>(File.ReadAllText(appJsonPath));
设置包含一个“有序的”字典。直接调用解串器时,键的顺序正确,如json设置文件中所示。但是IOptions <>返回的值包含一个字典,其中的键按字母顺序排序。然后,我尝试强制使用NewtonsoftJson:
private static void ConfigureServices(IConfiguration configuration, IServiceCollection services) { services.AddControllers().AddNewtonsoftJson(options => { options.SerializerSettings.ContractResolver = new DefaultContractResolver(); }); services.Configure<MyAppDataSettings>(configuration.GetSection(nameof(MyAppDataSettings))); services.AddSingleton<IMyService, MyService>(); } public static IHostBuilder CreateHostBuilder(string[] args) => new HostBuilder() .ConfigureServices((context, services) => { ConfigureServices(context.Configuration, services); }) .ConfigureAppConfiguration((context, configurationBuilder) => { var appExecPath = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName); var appSettingsPath = Path.GetFullPath(Path.Combine(appExecPath, @"Settings")); configurationBuilder .SetBasePath(appSettingsPath) .AddJsonFile("MySettings.json", false); });
使用Newtonsoft.Json解串器时的结果与使用System.Text.Json时的结果相同。
var appJsonData = JsonConvert.DeserializeObject<MyAppDataSettings>(File.ReadAllText(appJsonPath));
所以问题是:IOptions
如何实际反序列化?我想“魔术”发生在Microsoft.Extensions.Configuration.Json库中。
在阅读...的各个部分时,可以配置.Net Core 3.1控制台应用程序以使用Newtonsoft.Json库反序列化IOptions <>(来自Microsoft.Extensions.Options)。
出于枚举的目的,字典中的每个项目都被视为代表值及其键的KeyValuePair结构。返回物品的顺序是不确定的。
根据我的经验,我强烈建议您重新考虑您用于配置的方法,并摆脱订单依赖性。