2015-05-05 15 views
16

C'è un modo per avere sezioni di configurazione scritte in JSON anziché XML?Creazione di una sezione di configurazione JSON

Supponiamo Ho il seguente 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; } 
    } 
} 

posso quindi creare la seguente sezione di configurazione XML:

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

Quello che vorrei raggiungere è quello di mantenere stessa classe UsersConfig, ma invece di mapparlo in XML, vorrei mapparlo a un JSON:

+3

È possibile utilizzare le funzioni 'SerializeSection' e' DeserializeSection' dalla classe 'ConfigurationSection'. È possibile utilizzare un elemento CDATA all'interno dell'elemento Users per conservare dati arbitrari e quindi leggerlo durante la serializzazione/deserializzazione personalizzata. –

+0

Hai provato la seguente [libreria] (http://west-wind.com/westwind.applicationconfiguration/)? Dispone di 'Archiviazione di file .config, semplici file XML o JSON, stringhe o un database', quindi potrebbe valerne la pena dargli un'occhiata. –

+0

Intendi web.config? –

risposta

0

È possibile modificare la propria classe UsersConfig che sarà in grado di serializzare e deserializzare su JSON. Quindi scrivi un'altra classe che recupererà la configurazione dal tuo file. In app.config puoi aggiungere una singola impostazione che ti indicherà il punto in cui memorizzi la tua json config.

È possibile ottenere ciò facilmente utilizzando Json.Net e aggiungendo attributi alla classe UsersConfig.

+0

Non voglio serializzare e de-serializzare il file XML manualmente. Voglio approfittare di 'C# Configuration Sections', insieme alle classi associate e agli attributi di validazione. Voglio avere solo una classe 'ConfigurationSection' da rappresentare in XML o JSON –

0

// Per convertire un nodo XML contenuta in XML stringa in una stringa JSON

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

// Per convertire il testo contenuto in JSON JSON stringa in un nodo XML

XmlDocument doc = JsonConvert.DeserializeXmlNode(json); 

documentazione qui: Converting between JSON and XML with Json.NET

+0

Mi dispiace ma non è quello che ho chiesto. Ho chiesto se c'è un modo per mantenere la mia classe ConfigurationSection e lasciarmi scegliere se mi piacerebbe rappresentarlo come XML o come JSON. .NET si comporterebbe come con qualsiasi ConfigurationSection, associandolo automaticamente a una classe e applicando le convalide degli attributi. –

1

Se ho capito bene, in sostanza, si vogliono definire sezioni web.config come JSON piuttosto che XML.

Attualmente non c'è nulla di fuori dalla scatola che faccia ciò di cui sono a conoscenza. Comunque una possibile soluzione è usare Gulp per scrivere in modo dinamico il tuo file web.config come parte del tuo passo di costruzione. Non ho un esempio concreto in quanto non sono a conoscenza di nessuno, ma potrebbe darti un puntatore.

In primo luogo dare un'occhiata a questo articolo che illustra come è possibile utilizzare il modulo xmlpoke di scrivere XML:

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

lettura JSON in Gulp sarebbe un pezzo di torta, in modo che solo bisogno di mappare il JSON in XML. È quindi possibile aggiungere l'attività Gulp alla fase di compilazione modificando il file .proj xml (gulp deve essere installato globalmente sulla macchina su cui viene eseguita la build).

  1. apre il file proj in un editor di testo e individuare questa sezione:

    <Project> 
        <Target Name="BeforeBuild"> 
        <!-- Insert tasks to run before build here --> 
        </Target> 
    </Project> 
    
  2. Sostituire il commento con un comando sorso

    gulp taskname 
    

Un'alternativa è quella di utilizzare una libreria come Newtonsoft per leggere un file JSON dal disco. Quindi crea i tuoi attributi e il tuo sistema per mappare i valori alle proprietà della tua classe.Questo non è semplice ma potrebbe certamente essere fatto con qualche sforzo.

2

questa libreria potrebbe aiutare: https://github.com/Dynalon/JsonConfig:

dalla documentazione:

JsonConfig è un semplice da usare libreria di configurazione, permettendo file di configurazione basati JSON per il vostro C#/NET applicazione al posto di. ingombranti file web.config/application.config xml. È basato sulla funzione dinamica JSONFX e C# 4.0. Consente di inserire il file di configurazione dei programmi in file .json, in cui una configurazione predefinita può essere incorporata come risorsa o inserita nella cartella dell'applicazione (web-). È possibile accedere alla configurazione tramite i tipi dinamici , non sono necessarie classi personalizzate o altri codici stub. JsonConfig offre supporto per l'ereditarietà della configurazione, ovvero è possibile utilizzare un set di file di configurazione per avere una singola configurazione con ambito in fase di runtime, che è una versione unita di tutti i file di configurazione forniti.

1

Si consiglia di utilizzare FX.configuration, è possibile aggiungerlo da NuGet. si può trovare all'indirizzo: http://nugetmusthaves.com/Package/FX.Configuration

alcuni esempi di codice sono disponibili all'indirizzo: https://bitbucket.org/friendlyx/fx.configuration

che consente di aggiungere alla roba App.config come: < add key = valore "JsonConfig" = "{ 'Id': '42', 'Nome': 'foo'} "/>

un'altra opzione quando si utilizza FX.configuration consiste nell'aggiungere un nuovo file config.json con tutta la configurazione e alla creazione del ad esempio lo leggerà e lo analizzerà.

il seguente codice fa esattamente quello che ti serve con il nuovo file di configurazione di json.

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

Questa libreria è comunque ottima, ma sfortunatamente il link al friendlyx.com sito non è più attivo, ma il codice è aperto [https://bitbucket.org/friendlyx/fx.configuration](https://bitbucket.org/friendlyx/fx.configuration), quindi puoi procedere al repository per informazioni aggiuntive, come ad esempio casi di utilizzo o test unitari. –

+0

grazie per l'aggiornamento! – silver

Problemi correlati