构建JSON配置部分

时间:2015-05-05 01:26:37

标签: c# xml json c#-4.0 configuration

有没有办法让配置部分用JSON而不是XML编写?

假设我有以下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"
        }
    ]
}

5 个答案:

答案 0 :(得分:2)

此库可能会对您有所帮助:https://github.com/Dynalon/JsonConfig

来自文档:

  

JsonConfig是一个易于使用的配置库,允许使用JSON   基于C#/ .NET应用程序的配置文件,而不是繁琐的   web.config / application.config xml文件。它基于JsonFX和C#   4.0动态功能。允许将程序配置文件放入.json文件中,默认配置可以作为资源嵌入   放入(web-)应用程序文件夹。可以通过访问配置   动态类型,没有自定义类或任何其他存根代码是必要的。   JsonConfig支持配置继承,这意味着一组   配置文件可用于具有单个范围的配置   在运行时,它是所有提供的配置的合并版本   文件。

答案 1 :(得分:1)

如果我理解正确,您基本上希望将web.config部分定义为JSON而不是XML。

目前我所知道的没有任何开箱即用的功能。但是,一种可能的解决方案是使用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应该在正在执行构建的机器上全局安装)。

  1. 在文本编辑器中打开您的proj文件并找到此部分:

    <Project>
        <Target Name="BeforeBuild">
        <!-- Insert tasks to run before build here -->
        </Target>
    </Project>
    
  2. 用gulp命令替换注释

    gulp taskname
    
  3. 另一种方法是使用像Newtonsoft这样的库从磁盘读取JSON文件。然后创建自己的属性和系统,以便将值映射到类中的属性。这不是直截了当的,但肯定可以通过一些努力来完成。

答案 2 :(得分:1)

我建议使用FX.configuration,您可以从NuGet添加它。 你可以在http://nugetmusthaves.com/Package/FX.Configuration

找到它

可以在https://bitbucket.org/friendlyx/fx.configuration

找到一些代码示例

它使您能够添加到App.config之类的内容: &LT; add key =&#34; JsonConfig&#34; value =&#34; {&#39; Id&#39;:&#39; 42&#39;,&#39; Name&#39;:&#39; foo&#39; }&#34; /&GT;

使用FX.configuration时的另一个选择是添加一个包含所有配置的新config.json文件,并且在创建实例时它将读取并解析它。

以下代码完全符合您对新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; }
    }
}

答案 3 :(得分:0)

您可以更改自己的UsersConfig类,它将能够序列化和反序列化为JSON。然后编写另一个将从您的文件中检索配置的类。在app.config中,您可以添加单个设置,指向您存储json配置的位置。

您可以使用Json.Net并向UsersConfig类添加属性来轻松实现此目的。

答案 4 :(得分:0)

//将字符串xml中包含的XML节点转换为JSON字符串

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

//将字符串json中包含的JSON文本转换为XML节点

XmlDocument doc = JsonConvert.DeserializeXmlNode(json);

此处的文档:Converting between JSON and XML with Json.NET