2015-08-07 4 views
7

gelesen werden Ich habe gerade ASP.NET 5 installiert und eine Konsolenanwendung in Visual Studio erstellt. Ich habe eine Datei, config.json, zum Stammordner des Projekts hinzugefügt.Wie Werte von config.json in der Konsolenanwendung

Es sieht wie folgt aus:

{ 
"Data": { 
    "TargetFolderLocations": { 
     "TestFolder1": "Some path", 
     "TestFolder2": "Another path" 
    } 
} 

}

Meine Program.cs sieht aus wie dieses

Wie kann ich den TargetFolderLocations Schlüssel mit Code zugreifen?

+0

Ist es "Data.TargetFolderLocations"? – Hogan

+0

Funktioniert nicht mit .TargetFolderLocations arbeiten entweder leider ... – JOSEFtw

+0

ich habe es geschafft, es zu lösen, sehen Sie bitte meine Antwort :) – JOSEFtw

Antwort

3

einen Typ wie die folgenden haben:

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

Sie können dann die ConfigurationBinder verwenden automatisch wie oben Konfigurationsabschnitte Typen zu binden . Beispiel:

var folderSettings = ConfigurationBinder.Bind<FolderSettings>(config.GetConfigurationSection("Data")); 
var path = folderSettings.TargetFolderLocations["TestFolder1"]; 
+0

das ist wirklich sauber, ich hatte es vorher an Typen gebunden, aber ich denke die Syntax hat sich geändert und ich konnte keine Dokumentation finden ... werde das ausprobieren und es als korrekte Antwort akzeptieren, wenn es funktioniert! – JOSEFtw

0

Sie können JavaScriptSerializer (Namespace: System.Web.Extension) verwenden json ins Wörterbuch zu analysieren und einen beliebigen Wert auf seine Schlüssel aus json Basis finden. Sie Code würde:

string json = System.IO.File.ReadAllText("PathToJsonFile"); 
JavaScriptSerializer serializer = new JavaScriptSerializer(); 
Dictionary<string, object> dic = serializer.Deserialize<Dictionary<string, object>>(json); 

Wenn Sie über das Wörterbuch durchlaufen, können Sie alle Schlüssel sehen und ihre Werte mit dic bekommen.

* Nur eine alternative Lösung *

2

Die Art und Weisen Sie Ihre Frage formuliert haben, Ihre config.json Datei im Stammverzeichnis des Projektes ist es, aber Sie sind im Programmverzeichnis zur Laufzeit suchen. Angenommen, Sie führen das von Visual Studio aus, und davon ausgehend, dass Sie die Konfigurationsdatei zur Build-Zeit nicht kopieren, Environment.CurrentDirectory ist wahrscheinlich bin\Debug, und die Datei ist nicht da.

Sie können die Eigenschaften von config.json auf Copy always im Projektmappen-Explorer festlegen, um sicherzustellen, dass die Datei dorthin gelangt.

+2

Das ist nicht mehr der Fall. In VS 2015 mit installierten .NET Core 1.0-Tools haben Sie diese Option nicht mehr. Stattdessen fügen diese in "Buildoptions" in project.json: "copyToOutput": [ "config.json" ] – ScottRFrost

+0

@ScottRFrost Ihnen danken. Endlich habe ich meine Konsolenanwendung gestartet. –

2

Ich habe es geschafft, es so zu lösen:

public class Program 
{ 
    public IConfiguration Configuration { get; set; } 
    public Dictionary<string,string> Paths { get; set; } 
    public Program(IApplicationEnvironment app, 
      IRuntimeEnvironment runtime, 
      IRuntimeOptions options) 
    { 
     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

Danke JOSEFtw. Sie müssen Ihre Wörterbuch-Variable "Paths" initialisieren, sonst erhalten Sie eine NULL-Ausnahme. – Kwex