如何在控制台应用程序中从config.json读取值

11

我刚刚安装了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键?


它是 Data.TargetFolderLocations 吗? - Hogan
很遗憾,它也不能与.TargetFolderLocations一起使用... - JOSEFtw
我已经解决了它,请看我的答案 :) - JOSEFtw
4个回答

7

需要有以下类型:

public class FolderSettings
{
    public Dictionary<string, string> TargetFolderLocations { get; set; }
}

您可以使用ConfigurationBinder将配置部分自动绑定到上述类型。例如:
var folderSettings = ConfigurationBinder.Bind<FolderSettings>(config.GetConfigurationSection("Data"));
var path = folderSettings.TargetFolderLocations["TestFolder1"];

这真的很干净,我之前将它绑定到类型上,但我认为语法已经改变了,我找不到任何文档...如果它有效,我会尝试并接受它作为正确答案! - JOSEFtw

4
你可以使用JavascriptSerializer(命名空间:System.Web.Extension)将json解析成字典,并根据其键查找任何值。你的代码会变成这样:
 string json = System.IO.File.ReadAllText("PathToJsonFile");
 JavaScriptSerializer serializer = new JavaScriptSerializer();
 Dictionary<string, object> dic = serializer.Deserialize<Dictionary<string, object>>(json);

如果您遍历字典,您可以使用dic查看所有键并获取它们的值。 * 另一种解决方案 *

4
我已经这样解决了它:
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;
    }

1
谢谢JOSEFtw。你需要初始化你的“Paths”字典变量,否则会出现NULL异常。 - Kwex

3
根据你的问题描述,你的config.json文件位于项目的根目录,但在运行时你正在查找可执行目录。假设你是从Visual Studio中进行操作,并且假设你没有在构建时复制配置文件,那么Environment.CurrentDirectory可能是bin\Debug,而该文件并不存在于此处。
你可以从“解决方案资源管理器”中将config.json文件的属性设置为始终复制,以确保该文件被复制到正确位置。

2
这种情况不再存在。在安装了.NET Core 1.0工具的VS 2015中,您不再有此选项。相反,在project.json中的“buildOptions”中添加以下内容: "copyToOutput": [ "config.json" ] - Scott R. Frost
@ScottRFrost 谢谢。终于成功运行我的控制台应用程序了。 - Özgür Kaplan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接