Как создать файл config json

Обновлено: 07.07.2024

Предисловие

Как я уже писал в предыдущей статье, которая была опубликована в ноябре 2014 года:

Неудобство хранения в файле web.config в том, что при исполнении приложения (runtime) при внесении изменений в этот самый файл, система обязательно перезапускала процесс с хостом. Конечно же существуют разные обходные пути не перезапускать сайт, но это плохая идея, потому что пока AppDomain не перезапустится, изменения конфигурации не вступят в силу. Поэтому возникла идея хранить свои настройки вне файла web.config.

Задачи

Конфигурация приложения, далее будем ее называть ApplicationSettings должна:

  1. иметь возможность вливаться через dependency injection;
  2. иметь возможность обновиться в процессе работы системы без перезагрузки таковой;
  3. иметь варианты модификация RELEASE, DEBUG и другие, настроенные дополниельно;
  4. иметь формат возможность хранения в файле в формате и JSON, и XML, а также иметь возможность другого формата определенного разработчиком;
  5. иметь события, уведомляющее об загрузки (Deserialize completed) данных из файла;
  6. иметь кэширование загруженных данных;
  7. иметь возможность сбросить (перечитать) данных и файла конфигурации;
  8. иметь простой способ развертывания и поддержания.

Calabonga.Configuration

В отличии от предыдущей версии, все перечисленные задачи решает новая версия системы хранения конфигурации, Чтобы долго не расписывать как это всё работает, я создам демонстрационный проект, в котором покажу что нужно сделать, чтобы настройки хранились в JSON-файле.

Создаем новый проект в Visual Studio. Как обычно обновляем все существующие nuget-пакеты, выполнив команду:

После этого установливаем Calabonga.Configuration:

Далее создаем файл ApplicationSettings.cs в котором перечислим все необходимые нам настройки приложения. Я придумал вот что:

В общем, ничего сложного, поехали дальше.

По умолчанию Calabonga.Configuration ищет в корне сайта файл Config.json, создадим его:

Далее создадим менеджер, который будет нашей основной для вливания. Для этого подключим пространство имен using Calabonga.Configurations и унаследуемся базового класса, указав наш класс ApplicationSettings в качестве обобщенного параметра:

Обратите внимание, что для корректной работы класса нам потребуется еще два класса, вернее сказать, два интерфейса и их реализация: IConfigSerializer и ICacheService. В сборке существуют реализация обоих этих абстракций. Для IConfigSerializer есть JsonConfigSerializer и XmlConfigSerializer. Думаю, из названий ясно, как и что они сериализуют. А для ICacheService существует реализация в класее CacheService.

Если вам не нравятся названия или еще что-то, то вы можете в любой момент написать собственную реализацию этих интерфейсов, зарегистрировать их в контейнере. Стоп, контейнер! Про контейнер-то забыли!

Dependency Injection Container

Вначале статьи был упомянут DI-контейнер, давайте его установим. Я предпочитаю использовать Autofac:

Собственно говоря, нам больше ничего не мешает сделать вливание ApplicationSettings, например, в контролере HomeController.

Лирическое отступление. В процессе написания статьи, меня просто вывела из себя навязчивость Microsoft.ApplicationInsight.*, поэтому я удалил все nuget-пакеты и сборки вместе с ними. И только на старте приложения высвободилось порядка 40 Мб оперативной памяти.

Для того чтобы влить зависимость в контролер надо указать в конструкторе SettingsManager и обратиться к свойству Config:

Раз уже всё готово, запустим сайт.



Место для хранения

Посмотрите на предыдущую картинку. Свойства DirectoryName и FileName вы можете при неоходимости переопределить. Для этого в файле SettingsManager надо проделать следующее.


То есть перенести файл настроек в папку и "сказать" об этом менеджеру настроек. А еще можно использовать разные условия для выбора конфигурации (файлов).


Ну, и на последок, более сложная вариация на тему управления конфигурациями в "большом" приложение. Создаем интерфейс ISettingsManager:

Далее нужно применить первой конфигурации предварительно переименовав ее либо создать новую:

В 4-ой строке применен интерфейс. А далее создаем еще одну конфигурацию с таким же интерфейсом:

Теперь у нас две конфигурации, причем они могу находиться вообще разных сборках и попадать в контейнер при регистрации модулей (plugins). Для нашего случая я зарегистрирую их в одном контейнере с разными именами (Autofac легко позволяет сделать это):

После регистрации таким образом конфигураций можно вливать их, например в контролер, сразу все и использовать ту, которая больше нравится на выбор:

Ничто не мешает использовать параметры из разных конфигураций, о чем свидетельствуют 14 и 15 строки.

Заключение

В качестве заключения могу добавить следующее, сборка Calabonga.Configuration имеет в своем арсенале следующие методы и события:

Reload() - позволяте "на лету" перечитать данные из конфигурационного файла.

ReadValue<TValue>(Expression<Func<T, TValue>> e) - прочитать значение из параметра (лямбда)

ReadValue<TValue>(string propertyName) - прочитать значение параметра (название)

SaveChanges() - сохранить (сериализовать) конфигурацию в файл.

public event ConfigurationLoadedEventHandler<T> ConfigurationLoaded - событие, которые срабатывает, когда из файла только прочитаны данные

Такого набора хватает, чтобы реализовать модель поведения любой сложности. А если ко всему перечисленному добавить возможности DI-контейнера (lifecycle managment, IModule, XML configuration without explicite referrence и другие фишки), то это позволяет не просто решать любые вопросы, но и выбирать из нескольких вариантов решений.

Обозначение объектов JavaScript (JSON - JavaScript Object Notation) - стандартный текстовый формат для представления структурированных данных на основе синтаксиса объекта JavaScript. Он обычно используется для передачи данных в веб-приложениях (например, отправка некоторых данных с сервера клиенту,таким образом чтобы это могло отображаться на веб-странице или наоборот). Вы будете сталкиваться с этим довольно часто, поэтому в этой статье мы даём вам все, что вам нужно для работы с JSON используя JavaScript, включая парсинг JSON, чтобы вы могли получить доступ к данным внутри него при создании JSON.

Необходимые знания: Базовая компьютерная грамотность, базовые знания HTML и CSS, знакомство с основами JavaScript (см. First steps и Building blocks) и основами OOJS (see Introduction to objects).
Цель: Понять, как работать с данными, хранящимися в JSON, и создавать свои собственные объекты JSON.

Нет, действительно, что такое JSON?

JSON - текстовый формат данных, следующий за синтаксисом объекта JavaScript, который был популяризирован Дугласом Крокфордом. Несмотря на то, что он очень похож на буквенный синтаксис объекта JavaScript, его можно использовать независимо от JavaScript, и многие среды программирования имеют возможность читать (анализировать) и генерировать JSON.

JSON существует как строка,что необходимо при передаче данных по сети. Он должен быть преобразован в собственный объект JavaScript, если вы хотите получить доступ к данным. Это не большая проблема. JavaScript предоставляет глобальный объект JSON, который имеет методы для преобразования между ними.

Примечание: Преобразование строки в родной объект называется десериализацией (преобразование из последовательной формы в параллельную), в то время как преобразовании родного объекта в строку, таким образом ,чтобы он мог быть передан через сеть, называется сериализацией(преобразование в последовательную форму).

Объект JSON может быть сохранён в собственном файле, который в основном представляет собой текстовый файл с расширением .json и MIME type application/json .

Структура JSON

Как описано выше, JSON представляет собой строку, формат которой очень похож на буквенный формат объекта JavaScript. Вы можете включать одни и те же базовые типы данных внутри JSON, так же как и в стандартном объекте JavaScript - строки, числа, массивы, булевы и другие объектные литералы. Это позволяет построить иерархию данных, к примеру, так:

Если бы мы загрузили этот объект в программу JavaScript, создали переменную с названием superHeroes , мы могли бы затем получить доступ к данным внутри неё, используя те же самые точечную и скобочную нотации, которые мы рассмотрели в статье JavaScript object basics. Например:

Чтобы получить доступ к последующим данным по иерархии, вам просто нужно объединить требуемые имена свойств и индексы массивов. Например, чтобы получить доступ к третьей сверхспособности второго героя, указанного в списке участников, вы должны сделать следующее:

  1. Сначала у нас есть имя переменной - superHeroes .
  2. Внутри мы хотим получить доступ к свойству members , поэтому мы используем ['members'] .
  3. members содержат массив, заполненный объектами. Мы хотим получить доступ ко второму объекту внутри массива, поэтому мы используем [1] .
  4. Внутри этого объекта мы хотим получить доступ к свойству powers , поэтому мы используем ['powers'] .
  5. Внутри свойства powers находится массив, содержащий сверхспособности выбранного героя. Нам нужен третий, поэтому мы используем [2] .

Примечание. Мы сделали JSON, видимый выше, доступным внутри переменной в нашем примере JSONTest.html (см. исходный код). Попробуйте загрузить это, а затем получить доступ к данным внутри переменной через консоль JavaScript вашего браузера.

Массивы как JSON

Выше мы упоминали ,что JSON текст выглядит практически так же как и JavaScript объект,и это почти правильно.Причина,по которой мы говорим почти правильно заключается в том ,что массив также валиден JSON например:

Вышесказанное вполне справедливо для JSON. Вам просто нужно получить доступ к элементам массива (в его анализируемой версии), начиная с индекса массива, например [0]["powers"][0] .

Другие примечания

  • JSON - это чисто формат данных - он содержит только свойства, без методов.
  • JSON требует двойных кавычек, которые будут использоваться вокруг строк и имён свойств. Одиночные кавычки недействительны.
  • Даже одна неуместная запятая или двоеточие могут привести к сбою JSON-файла и не работать. Вы должны быть осторожны, чтобы проверить любые данные, которые вы пытаетесь использовать (хотя сгенерированный компьютером JSON с меньшей вероятностью включает ошибки, если программа генератора работает правильно). Вы можете проверить JSON с помощью приложения вроде JSONLint.
  • JSON может принимать форму любого типа данных, допустимого для включения в JSON, а не только массивов или объектов. Так, например, одна строка или номер будут действительным объектом JSON.
  • В отличие от кода JavaScript, в котором свойства объекта могут не заключаться в двойные кавычки, в JSON в качестве свойств могут использоваться только строки заключённые в двойные кавычки.

Активное обучение: Работа с примером JSON

Итак, давайте рассмотрим пример, чтобы показать то, как мы можем использовать некоторые данные JSON на веб-сайте.

Начало работы

Для начала создайте локальные копии наших файлов heroes.html и style.css. Последний содержит простой CSS для стилизации нашей страницы, в то время как первый содержит очень простой HTML-код сущности:

Плюс <script> , чтобы содержать код JavaScript, который мы будем писать в этом упражнении. На данный момент он содержит только две строки, которые захватывают ссылки на элементы <header> и <section> и сохраняют их в переменных:

Мы собираемся загрузить его на нашу страницу и использовать некоторые изящные манипуляции DOM, чтобы отобразить их, например:


Получение JSON

    Начнём с того, что мы собираемся сохранить URL-адрес JSON, который мы хотим получить в переменной. Добавьте нижеследующий код JavaScript:

Это занимает не менее двух параметров - есть другие доступные параметры. Нам нужно только два обязательных для этого простого примера:

Здесь мы сохраняем ответ на наш запрос (доступный в свойстве response ) в переменной superHeroes ; эта переменная теперь будет содержать объект JavaScript, основанный на JSON! Затем мы передаём этот объект двум вызовам функций - первый из них заполнит <header> правильными данными, а второй создаст информационную карту для каждого героя в команде и вставляет её в <section> .

Мы свернули код в обработчик событий, который запускается, когда событие загрузки запускается в объекте запроса (см. onload ) - это связано с тем, что событие загрузки запускается, когда ответ успешно возвращается; поступая таким образом,это гарантия того, что request.response определённо будет доступен, когда мы начнём работу с ним.

Теперь мы извлекли данные JSON и превратили его в объект JavaScript, давайте воспользуемся им, написав две функции, на которые мы ссылались выше. Прежде всего, добавьте следующее определение функции ниже предыдущего кода:

Мы назвали параметр jsonObj , чтобы напомнить себе, что этот объект JavaScript возник из JSON. Здесь мы сначала создаём элемент <h1> (en-US) с createElement() , устанавливаем его textContent равным свойству squadName объекта, а затем добавляем его в заголовок с помощью appendChild() . Затем мы выполняем очень похожую операцию с абзацем: создаём его, устанавливаем его текстовое содержимое и добавляем его в заголовок. Единственное различие заключается в том, что его текст задан, как конкатенированная строка, содержащая как homeTown , так и formed свойства объекта.

Создание информационных карт героя

Затем добавьте следующую функцию внизу кода, которая создаёт и отображает карты супергероев:

Для начала сохраним свойство members объекта JavaScript в новой переменной. Этот массив содержит несколько объектов, которые содержат информацию для каждого героя.

Затем мы используем for loop для циклического прохождения каждого объекта в массиве. Для каждого из них мы:

  1. Создаём несколько новых элементов: <article> , <h2> , три <p> и <ul> .
  2. Устанавливаем <h2> , чтобы содержать name текущего героя.
  3. Заполняем три абзаца своей secretIdentity , age и строкой, в которой говорится: «Суперспособности:», чтобы ввести информацию в список.
  4. Сохраняем свойство powers в другой новой переменной под названием superPowers - где содержится массив, в котором перечислены сверхспособности текущего героя.
  5. Используем другой цикл for , чтобы прокрутить сверхспособности текущего героя , для каждого из них мы создаём элемент <li> , помещаем в него сверхспособности, а затем помещаем listItem внутри элемента <ul> ( myList ) с помощью appendChild() .
  6. Последнее, что мы делаем, это добавляем <h2> , <p> и <ul> внутри <article> ( myArticle ), а затем добавляем <article> в <section> . Важное значение имеет порядок, в котором добавляются элементы, так как это порядок, который они будут отображать внутри HTML.

Примечание. Если вам не удаётся заставить этот пример работать, попробуйте обратиться к нашему исходному коду heroes-finished.html (см. также он работает в режиме live).

Примечание. Если у вас возникли проблемы после нотации точек / скобок, которые мы используем для доступа к объекту JavaScript, в этом поможет открытие файла superheroes.json на другой вкладке или в текстовом редакторе ,и обращаться к нему каждый раз, когда вам нужен JavaScript. Вы также можете обратиться к нашей статье JavaScript objectbasics чтобы получить дополнительную информацию о нотации точек и скобок.

Преобразование между объектами и текстом

Вышеприведённый пример был прост с точки зрения доступа к объекту JavaScript, потому что мы задали XHR-запрос для прямого преобразования ответа JSON в объект JavaScript, используя:

  • parse() : принимает строку JSON в качестве параметра и возвращает соответствующий объект JavaScript.
  • stringify() : принимает объект, как параметр и возвращает эквивалентную строковую JSON строку.

Вы можете увидеть первый метод в действии в нашем примере heroes-finished-json-parse.html (см. исходный код) - это то же самое, что и в примере, который мы создали ранее, за исключением того, что мы установили XHR для возврата сырого JSON текста, затем используется parse() , чтобы преобразовать его в фактический объект JavaScript. Ключевой фрагмент кода находится здесь:

Как вы могли догадаться, stringify() работает обратным образом. Попробуйте ввести следующие строки в консоль JavaScript браузера один за другим, чтобы увидеть его в действии:

Здесь мы создаём объект JavaScript, затем проверяем, что он содержит, а затем преобразуем его в строку JSON, используя stringify() , сохраняя возвращаемое значение в новой переменной, а затем снова проверяем его.

Резюме

В этой статье мы предоставили вам простое руководство по использованию JSON в ваших программах, в том числе о том, как создавать и анализировать JSON, и как получить доступ к данным, заблокированным внутри него. В следующей статье мы рассмотрим объектно-ориентированный JavaScript.


При настройке Homebridge, редактирование config.json у многих вызывает сложности. Но это проще, чем кажется.

Данная статья содержит информацию для понимания структуры JSON и настройке файла config.json.

Для облегчения процесса, я рекомендую использовать редактор кода, например, Atom или Visual Studio Code.

Я использую редактор Atom с набором расширений для него:

  1. jsonlint – проверка ошибок в JSON;
  2. atom-beautify – автоматическое форматирование текста;
  3. bracket-colorizer – подсветка скобок.

1600x_image.jpg?1573744197

Я подготовил пример простого файла config.json, где цветами выделены основные массивы его структуры:

Аксессуар WeMo (красный цвет) находится внутри “родительского” массива Accessories (желтый цвет), который, в свою очередь, находится внутри основного “родительского” массива (коричневый цвет). Это называется «вложением» и каждый аксессуар или платформа будет вложен внутри соответствующего “родителя” (Accessories или Platforms).

Помните, у вас только один массив Accessories и один массив Platforms. В каждом из этих массивов могут быть разные аксессуары и платформы (как в файле примера), если Accessories или Platforms будут указаны более одного раза, то вы получите ошибку.

Редактируя свой JSON-файл, вы будете добавлять детали в разделы аксессуаров и платформ (желтый и оранжевый соответственно).

В файле примера есть две платформы: Hue (зеленая) и Lifx (фиолетовая). Платформа Hue находится над Lifx , каждая платформа выделена фигурными скобками и отделена запятой.

Это говорит системе, что в “родительском” массиве Platforms, который выделен квадратными скобками, находятся два подмассива. Заметьте, что после раздела платформы Lifx нет запятой.

Это обусловлено тем, что в массиве Platforms нет других подмассивов после фигурной скобки, поэтому система знает, что нужно перестать искать другую платформу. Приведу пример конфигурации с ошибкой:

Запятая после последней фигурной скобки вызовет ошибку.

Это означает, что анализатор ожидал какие-либо данные после запятой, но вместо этого он получил закрытую квадратную скобку. Для правки ошибки найдите причины, по которым система будет ожидать больше данных. В данном случае мы говорим системе «после этой запятой у нас будет другой массив», что не соответствует истине.

То же правило касается структурирования данных внутри подмассивов. Посмотрите на раздел Hue (зеленый): запятые ставятся после каждой строки (подсказка, после первой строки есть только одна запятая).

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

Посмотрите на раздел Lifx (фиолетовый), который имеет 3 строки и обратите внимание на строки с запятой.

Здравствуйте.
Извените за возможно глупый вопрос,но все же подскажите новичку как делать правильно.
Естет у меня nodejs express проект,поанирую разворачивать его на нескольких машинах,и чтобы каждый раз не лазить в код сервера,хочу создать файл настроек (іп сервера,порт. ) как мне ето сделать правильно?

П.С. : А каким образом можно передають данные из етого конфига в клиенский JavaScript, из папки public, подключаемый к index.ejs ?

  • Вопрос задан более трёх лет назад
  • 4864 просмотра

MarcusAurelius

Правильного способа тут нет, есть много разных, все - не правильные. Предлагаю два из неправильных способов, на выбор:

в дополнение к вышесказанному предлагаю использовать ENV переменные для хранения той части конфигов, которое зависит от окружения (хосты, порты, пароли).

streetflush

А каким образом можно передають данные из етого конфига в клиенский JavaScript, из папки public, подключаемый к index.ejs ?

k12th

Два варианта:
app.locals.config = require('./config');
Теперь в серверных шаблонах будет доступна переменная config. Можно сделать так:


Второй вариант: сделать контроллер, который будет читать конфиг и отдавать его джейсоном, ходить в этот контроллер аяксом.

Возможно, что придется эти два подхода как-то совмещать:)

k12th

Я делаю вот так: примерчик и описание. Смысл примерно такой же, как в приложениях на Django: конфиг это код, импортим модуль в зависимости от некоторой переменной окружения, ./local.js имеет приоритет надо всем остальным.

Достоинства: очень гибко; можно "наследовать" друг от друга и переопределять конфиги в любом сочетании; не надо учить еще один язык конфигов (превед ямл) и не надо мириться с его недостатками (превед джейсон).
Недостатки: не декларативно; нет npm-модуля, чтоб из коробки; require кэширует подключенные модули, так что для обновления конфига на лету надо плясать с бубном.

Читайте также: