我有一个控制台应用程序,它使用。NET通用主机,用于读取设置和依赖注入。
如何配置哪个库用于解析JSON配置文件(appsettings.json
(?我想用Newtonsoft Json。NET而不是默认值(System.Text.Json
(。
背景:我的设置文件有BigInteger
值,Newtonsoft处理得很好,但无法使用默认值加载。
请注意,这是关于ASP的明确而非。NET,但却是一个普通的控制台应用程序。很难找到适用于简单控制台应用程序用例的东西,因为谷歌上的一切都是关于ASP的。NET。
设置主机的代码当前如下所示:
Host
.CreateDefaultBuilder()
.ConfigureLogging(...)
.ConfigureServices(...)
.UseConsoleLifetime()
.Build()
.StartAsync();
肯定有一个地方可以连接Newtonsoft JSON解析器。
(.NET 6(
配置在控制台应用程序中的工作原理与在ASP中的相同。NET。默认值可能不同,但概念是相同的。
您需要添加newtonsoft json配置提供程序,并去掉默认的json配置提供方。
请参阅此处的扩展方法文档:https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.configuration.newtonsoftjsonconfigurationextensions?view=dotnet-平台-ext-3.1&viewFallbackFrom=dotnet-plat-ext-6.0
有关添加和删除配置提供程序的一般信息,请参见此处:https://learn.microsoft.com/en-us/dotnet/core/extensions/configuration-providers
完整控制台示例:
appsettings.json
{
"MySection": {
"MyBigValue": 2928298298298292898298292254353453534435353
}
}
程序.cs
//this requires adding the Microsoft.Extensions.Configuration.NewtonsoftJson package
using System.Numerics;
using Microsoft.Extensions.Configuration.Json;
using Microsoft.Extensions.Options;
var host = Host
.CreateDefaultBuilder()
.ConfigureAppConfiguration((hostingContext, configuration) =>
{
//note this whole section is probably unneeded because conversion is happening in the ConfigurationBinder class
//and json conversion has nothing to do with it
//remove old JSON source
var jsonSources = configuration.Sources.Where(s => s is JsonConfigurationSource).Cast<JsonConfigurationSource>().ToList();
jsonSources.ForEach(s => configuration.Sources.Remove(s));
//replace them with newtonsoft sources
jsonSources.ForEach(s =>
{
if (File.Exists(s.Path))
configuration.AddNewtonsoftJsonFile(s.Path);
});
//note this will put the JSON sources after the environment variable sources which is not how it is by default
})
.ConfigureServices((hostcontext, services) =>
{
var mySection = hostcontext.Configuration.GetSection("MySection");
services.Configure<MySection>(mySection);
})
.UseConsoleLifetime()
.Build();
host.StartAsync();
var mySection = host.Services.GetRequiredService<IOptions<MySection>>().Value;
Console.WriteLine(mySection.MyBigValueInt);
Console.ReadLine();
class MySection
{
public string MyBigValue { get; set; }
//a more complex alternative to using this property is to register a TypeConverter for BigInteger that does the string conversion
public BigInteger MyBigValueInt => BigInteger.Parse(MyBigValue);
}