Создание секции конфигурации JSON

Есть ли способ иметь разделы конфигурации, написанные в 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>

То, что я хотел бы достичь, - это mantain тот же класс UsersConfig, но вместо того, чтобы сопоставлять его с XML, я хотел бы сопоставить его с JSON:

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

Ответы

Ответ 1

эта библиотека может вам помочь: https://github.com/Dynalon/JsonConfig:

из документации:

JsonConfig - простая в использовании библиотека конфигурации, позволяющая JSON основанные на конфигурации файлы для вашего приложения С#/. NET, а не громоздкие файлы web.config/application.config xml. Он основан на JsonFX и С# 4.0 динамическая функция. Позволяет помещать ваш файл конфигурации программы в файлы .json, где конфигурация по умолчанию может быть встроена в качестве ресурса или поместите в папку (веб-приложение). Доступ к конфигурации возможен через динамические типы, не требуется никаких пользовательских классов или любого другого кода-заглушки. JsonConfig поддерживает поддержку наследования config, что означает набор конфигурационные файлы могут использоваться для конфигурации с одной областью во время выполнения, которая является объединенной версией всей предоставленной конфигурации файлы.

Ответ 2

Если я правильно понимаю, вы действительно хотите определить разделы web.config как JSON, а не XML.

В настоящее время нет ничего из этого, что я знаю. Однако одним из возможных решений является использование Gulp для динамической записи файла web.config в качестве части вашего шага сборки. У меня нет конкретного примера, поскольку я не знаю, кто это делает, но это может дать вам указатель.

Сначала рассмотрим эту статью, в которой обсуждается, как вы можете использовать модуль xmlpoke для записи XML:

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

Чтение JSON в Gulp будет частью торта, поэтому вам просто нужно сопоставить JSON в XML. Затем вы можете добавить задачу Gulp на свой шаг сборки, отредактировав файл .proj xml (gulp должен быть установлен глобально на машине, на которой выполняется сборка).

  • Откройте файл proj в текстовом редакторе и найдите этот раздел:

    <Project>
        <Target Name="BeforeBuild">
        <!-- Insert tasks to run before build here -->
        </Target>
    </Project>
    
  • Заменить комментарий командой Gulp

    gulp taskname
    

Альтернативой является использование библиотеки, такой как Newtonsoft, для чтения JSON файла с диска. Затем создайте свои собственные атрибуты и систему для сопоставления значений свойствам вашего класса. Это не прямолинейно, но может быть сделано с некоторыми усилиями.

Ответ 3

Я рекомендую использовать 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 - это добавить новый файл 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; }
    }
}

Ответ 4

Вы можете изменить свой собственный класс UsersConfig, чтобы он мог сериализовать и десериализовать JSON. Затем напишите другой класс, который будет извлекать конфигурацию из вашего файла. В app.config вы можете добавить одну настройку, которая укажет вам место, где вы храните конфигурацию json.

Вы можете легко достичь этого, используя Json.Net и добавив атрибуты в свой класс UsersConfig.

Ответ 5

//Преобразование XML node, содержащегося в строке xml, в строку JSON

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

//Чтобы преобразовать текст JSON, содержащийся в строке json, в XML node

XmlDocument doc = JsonConvert.DeserializeXmlNode(json);

Документация здесь: Преобразование между JSON и XML с помощью Json.NET