2015-05-05 7 views
16

Gibt es eine Möglichkeit, Konfigurationsabschnitte in JSON anstelle von XML zu schreiben?Erstellen eines JSON-Konfigurationsabschnitts

Nehmen wir an, ich habe folgendes ConfigurationSection:

public class UsersConfig : ConfigurationSection { 

     [ConfigurationProperty("users", 
          IsRequired = false)] 
     public UserCollection Users { 
      get { return this["users"] as UserCollection; } 
     } 
} 

[ConfigurationCollection(typeof(UserElement), 
    AddItemName = "user"] 
public class UsersCollection : ConfigurationElementCollection { 
     protected override ConfigurationElement CreateNewElement() { 
      return new UserElement(); 
     } 

     protected override object GetElementKey(ConfigurationElement element) { 
      return ((UserElement)element).Name; 
     } 
} 

public class UserElement : ConfigurationElement { 

    [ConfigurationProperty("name", 
          IsRequired = true, 
          IsKey = true)] 
    public string Name { 
      get { return this["name"] as string; } 
      set { this["name"] = value; } 
    } 
} 

dann kann ich den folgenden XML-Konfigurationsabschnitt erstellen:

<users-config> 
     <users> 
      <user name="Matt458" /> 
      <user name="JohnLennon" /> 
     </users> 
</users-config> 

Was würde ich erreichen will ist die gleiche UsersConfig Klasse mantain, aber anstatt es auf XML abzubilden, möchte ich es einem JSON zuordnen:

{ 
    "users": [ 
     { 
      "name": "Matt458" 
     }, 
     { 
      "name": "JohnLennon" 
     } 
    ] 
} 
+3

Es ist möglich, die 'SerializeSection'- und' DeserializeSection' -Überschreibungen von der 'ConfigurationSection'-Klasse zu verwenden. Sie können ein CDATA-Element im Element "Users" verwenden, um beliebige Daten zu speichern und sie dann während der benutzerdefinierten Serialisierung/Deserialisierung auszulesen. –

+0

Haben Sie die folgende [Bibliothek] (http://west-wind.com/westwind.applicationconfiguration/) versucht? Es enthält 'Storage to .config-Dateien, einfache XML- oder JSON-Dateien, Strings oder eine Datenbank ', so dass es sich lohnt, einen Blick darauf zu werfen. –

+0

Meinst du web.config? –

Antwort

0

Sie können Ihre eigene UsersConfig-Klasse ändern, die in JSON serialisiert und deserialisiert werden kann. Schreiben Sie dann eine andere Klasse, die die Konfiguration aus Ihrer Datei abruft. In app.config können Sie einzelne Einstellungen hinzufügen, die Sie auf den Ort verweisen, an dem Sie Ihre json-Konfiguration speichern.

Sie können dies einfach erreichen, indem Sie Json.Net verwenden und Ihrer UsersConfig-Klasse Attribute hinzufügen.

+0

Ich möchte die XML-Datei nicht manuell serialisieren und deserialisieren. Ich möchte "C# -Konfigurationsabschnitte" zusammen mit den zugehörigen Klassen und Validierungsattributen nutzen. Ich möchte nur eine 'ConfigurationSection'-Klasse haben, die in XML oder JSON dargestellt wird. –

0

// Um ​​einen XML-Knoten in Zeichenfolge xml in einen JSON-String

XmlDocument doc = new XmlDocument(); 
doc.LoadXml(xml); 
string jsonText = JsonConvert.SerializeXmlNode(doc); 

// enthalten konvertiert in string json in einen XML-Knoten

XmlDocument doc = JsonConvert.DeserializeXmlNode(json); 

Dokumentation hier enthaltenen JSON Text zu konvertieren: Converting between JSON and XML with Json.NET

+0

Es tut mir leid, aber das ist nicht das, was ich gefragt habe. Ich fragte, ob es eine Möglichkeit gäbe, meine ConfigurationSection-Klasse beizubehalten und mich entscheiden zu lassen, ob ich sie als XML oder als JSON darstellen möchte. .NET würde sich wie jeder ConfigurationSection verhalten und es automatisch einer Klasse zuordnen und Attributvalidierungen anwenden. –

1

Wenn ich richtig verstehe, möchten Sie im Wesentlichen web.config Abschnitte als JSON statt XML definieren.

Derzeit gibt es nichts, was mir bekannt ist. Eine mögliche Lösung besteht jedoch darin, Gulp zum dynamischen Schreiben Ihrer Datei web.config als Teil Ihres Build-Schritts zu verwenden. Ich habe kein konkretes Beispiel, da mir nicht bewusst ist, dass jemand das tut, aber das könnte Ihnen einen Hinweis geben.

Zuerst haben einen Blick auf diesen Artikel, der beschreibt, wie Sie das xmlpoke Modul XML schreiben können:

http://www.mikeobrien.net/blog/using-gulp-to-build-and-deploy-dotnet-apps-on-windows/

Lesen JSON in Gulp wäre ein Stück Kuchen, so dass Sie nur abbilden müssen der JSON in XML. Sie können dann den Gulp-Task zu Ihrem Build-Schritt hinzufügen, indem Sie Ihre .proj-XML-Datei bearbeiten (gulp sollte global auf dem Rechner installiert sein, auf dem der Build ausgeführt wird).

  1. Ihre proj-Datei in einem Texteditor öffnen und diesen Abschnitt finden:

    <Project> 
        <Target Name="BeforeBuild"> 
        <!-- Insert tasks to run before build here --> 
        </Target> 
    </Project> 
    
  2. Ersetzen Sie den Kommentar mit einem großen Schluck Befehl

    gulp taskname 
    

Eine Alternative zu verwenden ist eine Bibliothek wie Newtonsoft, um eine JSON-Datei von der Festplatte zu lesen. Erstellen Sie dann Ihre eigenen Attribute und Ihr eigenes System, um die Werte den Eigenschaften in Ihrer Klasse zuzuordnen.Dies ist nicht geradlinig, aber sicherlich mit etwas Aufwand getan werden.

2

diese Bibliothek könnte Ihnen helfen: https://github.com/Dynalon/JsonConfig:

aus der Dokumentation:

JsonConfig ist eine einfache Konfigurationsbibliothek zu verwenden, so dass JSON basierte Konfigurationsdateien für C#/.NET-Anwendung statt. umständlich web.config/application.config XML-Dateien. Es basiert auf JsonFX und C# 4.0 dynamische Funktion. Erlaubt das Einfügen Ihrer Programmkonfigurationsdatei in .json-Dateien, wobei eine Standardkonfiguration als Ressource oder in den (Web-) Anwendungsordner eingebettet werden kann. Auf die Konfiguration kann über dynamische Typen zugegriffen werden, keine benutzerdefinierten Klassen oder andere Stub-Code ist erforderlich. JsonConfig bietet Unterstützung für die Konfigurationsvererbung, dh eine Gruppe von Konfigurationsdateien kann verwendet werden, um eine einzelne Bereichskonfiguration zur Laufzeit zu haben, die eine zusammengeführte Version aller bereitgestellten Konfigurationsdateien ist.

1

Ich empfehle, FX.configuration zu verwenden, Sie können es von NuGet hinzufügen. Sie können es unter: http://nugetmusthaves.com/Package/FX.Configuration

einige Code-Beispiele finden Sie unter: https://bitbucket.org/friendlyx/fx.configuration

es Sie in die App.config Sachen hinzufügen können wie: < add key = "JsonConfig" value = "{ 'Id': '42', 'Name': 'foo'} "/>

Eine weitere Option bei der Verwendung der FX.configuration ist das Hinzufügen einer neuen config.json Datei mit all Ihrer Konfiguration und bei der Erstellung der Instanz wird es lesen und analysieren.

Der folgende Code tut genau das, was Sie mit der neuen json-Konfigurationsdatei benötigen.

using System.Collections.Generic; 
using FX.Configuration; 
namespace JsonConfigurationConsole 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var config = new Users(); 
     } 
    } 
    public class Users : JsonConfiguration 
    { 
     public List<User> users { get; set; } 
    } 
    public class User 
    { 
     public string name { get; set; } 
    } 
} 
+0

Diese Bibliothek ist immer noch toll, aber leider der Link zum Friendlyx.Die Seite ist nicht mehr aktiv, aber der Code ist offen [https://bitbucket.org/friendlyx/fx.configuration](https://bitbucket.org/friendlyx/fx.configuration), so dass Sie weitermachen können Repository für zusätzliche Informationen wie Usecases oder Unit Tests. –

+0

danke für das Update! – silver