XMLではなくJSONで構成セクションを記述する方法はありますか?
次の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; }
}
}
その後、次のXML構成セクションを作成できます。
<users-config>
<users>
<user name="Matt458" />
<user name="JohnLennon" />
</users>
</users-config>
私が達成したいのは、同じUsersConfigクラスを保持することですが、XMLにマッピングする代わりに、JSONにマッピングしたいと思います。
{
"users": [
{
"name": "Matt458"
},
{
"name": "JohnLennon"
}
]
}
このライブラリはあなたを助けるかもしれません: https://github.com/Dynalon/JsonConfig :
ドキュメントから:
JsonConfigは使いやすい構成ライブラリであり、面倒なweb.config/application.config xmlファイルの代わりにC#/。NETアプリケーションのJSONベースの構成ファイルを使用できます。 JsonFXとC#4.0の動的機能に基づいています。プログラムの構成ファイルを.jsonファイルに配置できます。デフォルトの構成は、リソースとして埋め込むか、(web-)applicationフォルダーに配置できます。構成には動的タイプを介してアクセスでき、カスタムクラスやその他のスタブコードは必要ありません。 JsonConfigは、構成の継承をサポートします。つまり、構成ファイルのセットを使用して、提供されたすべての構成ファイルのマージされたバージョンである実行時に単一のスコープ構成を使用できます。
FX.configurationを使用することをお勧めします。NuGetから追加できます。以下で見つけることができます: http://nugetmusthaves.com/Package/FX.Configuration
いくつかのコード例は次の場所にあります: https://bitbucket.org/friendlyx/fx.configuration
次のようなApp.configに追加できます:<add key = "JsonConfig" value = "{'Id': '42'、 'Name': 'foo'}" />
fX.configurationを使用する場合のもう1つのオプションは、すべての構成を含む新しいconfig.jsonファイルを追加し、インスタンスの作成時にそれを読み取って解析することです。
次のコードは、新しいjson configファイルで必要なことを正確に行います。
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; }
}
}
私が正しく理解していれば、本質的にweb.configセクションをXMLではなくJSONとして定義することになります。
現時点では、これを行うためにすぐに使用できるものはありません。ただし、考えられる解決策の1つは、Gulpを使用して、ビルド手順の一部としてweb.configファイルを動的に書き込むことです。私はこれをしている人を知らないので、具体的な例はありませんが、これはあなたに指針を与えるかもしれません。
最初に、xmlpokeモジュールを使用してXMLを記述する方法を説明するこの記事をご覧ください。
http://www.mikeobrien.net/blog/using-gulp-to-build-and-deploy-dotnet-apps-on-windows/
GulpでJSONを読み取ることは簡単なので、JSONをXMLにマップするだけです。その後、.proj xmlファイルを編集して、Gulpタスクをビルドステップに追加できます(gulpは、ビルドが実行されているマシンにグローバルにインストールする必要があります)。
テキストエディターでprojファイルを開き、このセクションを見つけます。
<Project>
<Target Name="BeforeBuild">
<!-- Insert tasks to run before build here -->
</Target>
</Project>
コメントをgulpコマンドに置き換えます
gulp taskname
別の方法は、Newtonsoftなどのライブラリを使用してディスクからJSONファイルを読み取ることです。次に、値をクラスのプロパティにマッピングするための独自の属性とシステムを作成します。これは簡単なことではありませんが、ある程度の努力をすれば確実に実行できます。
//文字列xmlに含まれるXMLノードをJSON文字列に変換するには
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
string jsonText = JsonConvert.SerializeXmlNode(doc);
//文字列jsonに含まれるJSONテキストをXMLノードに変換するには
XmlDocument doc = JsonConvert.DeserializeXmlNode(json);
ここのドキュメント: Json.NETでJSONとXMLを変換する
JSONにシリアライズおよびデシリアライズできるように、独自のUsersConfigクラスを変更できます。次に、ファイルから構成を取得する別のクラスを作成します。 app.configで、json configを保存する場所を指す単一の設定を追加できます。
これを簡単に実現するには、Json.Netを使用し、UsersConfigクラスに属性を追加します。