如何在控制台应用程序中读取 config.json 的值
How to read values from config.json in Console Application
我刚刚安装了 ASP.NET 5 并在 Visual Studio 中创建了一个控制台应用程序。我已将文件 config.json 添加到项目的根文件夹。
看起来像这样:
{
"Data": {
"TargetFolderLocations": {
"TestFolder1": "Some path",
"TestFolder2": "Another path"
}
}
}
我的Program.cs看起来像这样
public void Main(string[] args)
{
var configurationBuilder = new ConfigurationBuilder(Environment.CurrentDirectory)
.AddJsonFile("config.json")
.AddEnvironmentVariables();
Configuration = configurationBuilder.Build();
//Doesn't work...null all the time
var test = Configuration.Get("Data:TargetFolderLocations");
Console.ReadLine();
}
如何使用代码访问 TargetFolderLocations 键?
您可以使用 JavascriptSerializer(命名空间:System.Web.Extension)将 json 解析为字典,并根据 json 中的键查找任何值。您的代码将变为:
string json = System.IO.File.ReadAllText("PathToJsonFile");
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = serializer.Deserialize<Dictionary<string, object>>(json);
如果遍历字典,您可以看到所有键并使用 dic 获取它们的值。
* 只是一个替代解决方案 *
按照您提出问题的方式,您的 config.json
文件位于项目的根目录,但您在运行时查看可执行目录。假设您从 Visual Studio 执行此操作,并且假设您没有在构建时复制配置文件,Environment.CurrentDirectory
可能是 bin\Debug
,并且该文件不存在。
您可以从解决方案资源管理器中将 config.json
的属性设置为 Copy always
,以确保文件到达那里。
我是这样解决的:
public class Program
{
public IConfiguration Configuration { get; set; }
public Dictionary<string,string> Paths { get; set; }
public Program(IApplicationEnvironment app,
IRuntimeEnvironment runtime,
IRuntimeOptions options)
{
Paths = new Dictionary<string, string>();
Configuration = new ConfigurationBuilder()
.AddJsonFile(Path.Combine(app.ApplicationBasePath, "config.json"))
.AddEnvironmentVariables()
.Build();
}
public void Main(string[] args)
{
var pathKeys = Configuration.GetConfigurationSections("TargetFolderLocations");
foreach (var pathItem in pathKeys)
{
var tmp = Configuration.Get($"TargetFolderLocations:{pathItem.Key}");
Paths.Add(pathItem.Key, tmp);
}
return;
}
具有如下类型:
public class FolderSettings
{
public Dictionary<string, string> TargetFolderLocations { get; set; }
}
然后您可以使用 ConfigurationBinder
将配置部分自动绑定到上述类型。示例:
var folderSettings = ConfigurationBinder.Bind<FolderSettings>(config.GetConfigurationSection("Data"));
var path = folderSettings.TargetFolderLocations["TestFolder1"];
我刚刚安装了 ASP.NET 5 并在 Visual Studio 中创建了一个控制台应用程序。我已将文件 config.json 添加到项目的根文件夹。
看起来像这样:
{
"Data": {
"TargetFolderLocations": {
"TestFolder1": "Some path",
"TestFolder2": "Another path"
}
}
}
我的Program.cs看起来像这样
public void Main(string[] args)
{
var configurationBuilder = new ConfigurationBuilder(Environment.CurrentDirectory)
.AddJsonFile("config.json")
.AddEnvironmentVariables();
Configuration = configurationBuilder.Build();
//Doesn't work...null all the time
var test = Configuration.Get("Data:TargetFolderLocations");
Console.ReadLine();
}
如何使用代码访问 TargetFolderLocations 键?
您可以使用 JavascriptSerializer(命名空间:System.Web.Extension)将 json 解析为字典,并根据 json 中的键查找任何值。您的代码将变为:
string json = System.IO.File.ReadAllText("PathToJsonFile");
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = serializer.Deserialize<Dictionary<string, object>>(json);
如果遍历字典,您可以看到所有键并使用 dic 获取它们的值。
* 只是一个替代解决方案 *
按照您提出问题的方式,您的 config.json
文件位于项目的根目录,但您在运行时查看可执行目录。假设您从 Visual Studio 执行此操作,并且假设您没有在构建时复制配置文件,Environment.CurrentDirectory
可能是 bin\Debug
,并且该文件不存在。
您可以从解决方案资源管理器中将 config.json
的属性设置为 Copy always
,以确保文件到达那里。
我是这样解决的:
public class Program
{
public IConfiguration Configuration { get; set; }
public Dictionary<string,string> Paths { get; set; }
public Program(IApplicationEnvironment app,
IRuntimeEnvironment runtime,
IRuntimeOptions options)
{
Paths = new Dictionary<string, string>();
Configuration = new ConfigurationBuilder()
.AddJsonFile(Path.Combine(app.ApplicationBasePath, "config.json"))
.AddEnvironmentVariables()
.Build();
}
public void Main(string[] args)
{
var pathKeys = Configuration.GetConfigurationSections("TargetFolderLocations");
foreach (var pathItem in pathKeys)
{
var tmp = Configuration.Get($"TargetFolderLocations:{pathItem.Key}");
Paths.Add(pathItem.Key, tmp);
}
return;
}
具有如下类型:
public class FolderSettings
{
public Dictionary<string, string> TargetFolderLocations { get; set; }
}
然后您可以使用 ConfigurationBinder
将配置部分自动绑定到上述类型。示例:
var folderSettings = ConfigurationBinder.Bind<FolderSettings>(config.GetConfigurationSection("Data"));
var path = folderSettings.TargetFolderLocations["TestFolder1"];