Existe-t-il un moyen d'avoir des sections de configuration écrites en JSON au lieu de XML?
Supposons que j'ai le ConfigurationSection
suivant:
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; }
}
}
Je peux ensuite créer la section de configuration XML suivante:
<users-config>
<users>
<user name="Matt458" />
<user name="JohnLennon" />
</users>
</users-config>
Ce que je voudrais réaliser est de conserver la même classe UsersConfig, mais au lieu de le mapper en XML, je voudrais le mapper en JSON:
{
"users": [
{
"name": "Matt458"
},
{
"name": "JohnLennon"
}
]
}
cette bibliothèque peut vous aider: https://github.com/Dynalon/JsonConfig :
de la documentation:
JsonConfig est une bibliothèque de configuration simple à utiliser, permettant des fichiers de configuration basés sur JSON pour votre application C # /. NET au lieu de fichiers xml web.config/application.config encombrants. Il est basé sur la fonction dynamique JsonFX et C # 4.0. Permet de placer le fichier de configuration de vos programmes dans des fichiers .json, où une configuration par défaut peut être incorporée en tant que ressource ou placée dans le dossier d'application (Web). La configuration est accessible via des types dynamiques, aucune classe personnalisée ou tout autre code de raccord n'est nécessaire. JsonConfig prend en charge l'héritage de configuration, ce qui signifie qu'un ensemble de fichiers de configuration peut être utilisé pour avoir une seule configuration de portée au moment de l'exécution, qui est une version fusionnée de tous les fichiers de configuration fournis.
Je recommande d'utiliser FX.configuration, vous pouvez l'ajouter à partir de NuGet. vous pouvez le trouver sur: http://nugetmusthaves.com/Package/FX.Configuration
quelques exemples de code peuvent être trouvés sur: https://bitbucket.org/friendlyx/fx.configuration
il vous permet d'ajouter à la substance App.config comme: <add key = "JsonConfig" value = "{'Id': '42', 'Name': 'foo'}" />
une autre option lors de l'utilisation de FX.configuration est d'ajouter un nouveau fichier config.json avec toute votre configuration et lors de la création de l'instance, il le lira et l'analysera.
le code suivant fait exactement ce dont vous avez besoin avec le nouveau fichier de configuration 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; }
}
}
Si je comprends bien, vous voulez essentiellement définir les sections web.config en JSON plutôt qu'en XML.
Il n'y a actuellement rien de prémédité qui fasse cela que je sache. Cependant, une solution possible consiste à utiliser Gulp pour écrire dynamiquement votre fichier web.config dans le cadre de votre étape de génération. Je n'ai pas d'exemple concret car je ne suis au courant de personne faisant cela, mais cela pourrait vous donner un pointeur.
Jetez d'abord un œil à cet article qui explique comment vous pouvez utiliser le module xmlpoke pour écrire du XML:
http://www.mikeobrien.net/blog/using-gulp-to-build-and-deploy-dotnet-apps-on-windows/
La lecture de JSON dans Gulp serait un jeu d'enfant, il vous suffit donc de mapper le JSON en XML. Vous pouvez ensuite ajouter la tâche Gulp à votre étape de génération en modifiant votre fichier xml .proj (gulp doit être installé globalement sur la machine sur laquelle la génération est effectuée).
Ouvrez votre fichier proj dans un éditeur de texte et recherchez cette section:
<Project>
<Target Name="BeforeBuild">
<!-- Insert tasks to run before build here -->
</Target>
</Project>
Remplacez le commentaire par une commande gulp
gulp taskname
Une alternative consiste à utiliser une bibliothèque telle que Newtonsoft pour lire un fichier JSON à partir du disque. Créez ensuite vos propres attributs et système pour mapper les valeurs aux propriétés de votre classe. Ce n'est pas simple, mais cela pourrait certainement être fait avec un certain effort.
// Pour convertir un nœud XML contenu dans la chaîne xml en une chaîne JSON
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
string jsonText = JsonConvert.SerializeXmlNode(doc);
// Pour convertir le texte JSON contenu dans la chaîne json en un nœud XML
XmlDocument doc = JsonConvert.DeserializeXmlNode(json);
Documentation ici: Conversion entre JSON et XML avec Json.NET
Vous pouvez modifier votre propre classe UsersConfig qu'elle pourra sérialiser et désérialiser en JSON. Ensuite, écrivez une autre classe qui récupérera la configuration de votre fichier. Dans app.config, vous pouvez ajouter un paramètre unique qui vous dirigera vers l'endroit où vous stockez votre configuration json.
Vous pouvez y parvenir facilement en utilisant Json.Net et en ajoutant des attributs à votre classe UsersConfig.