Как включить файл / объект JSON в C во время сборки

#c #c #json #cmake

#c #c #json #cmake

Вопрос:

У меня есть файл JSON с конфигурацией среды базы данных под названием env-config.json, подобный этому:

 {
"LATEST":{
"DB_DATABASE":"databasename",
"DB_HOST":"hosturl",
"DB_PORT":"3306",
"DB_USER":"root",
"POOL_MAX":1
},
"PROD":{
"DB_DATABASE":"databasename",
"DB_HOST":"hosturl",
"DB_PORT":"3306",
"DB_USER":"root",
"POOL_MAX":1
}
}
  

находится в корне исходного кода проекта c

итак, я хочу легко использовать эту конфигурацию в формате json, но использовать ее, например, из моего скомпилированного кода c

когда программа выполняет запрос к системе, какая среда, например

 system.getEnvironment()
  

система выдает «PROD»

в этот момент вызовите этот файл JSON и извлеките информацию для использования в программе.

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

я пытаюсь с:

 file (STRINGS "env-config.json" CONFIG)

add_definitions (-DENV_CONFIG=${CONFIG})
  

и после этого используйте эту строку в программе, но проблема в том, что сбой cmake из-за того, что все области из json, да, я могу поместить json в строковый формат с большим количеством n и областей, но я потеряю формат json для чтения.

Возможно ли, например, сохранить мой файл json в неизмененном виде в формате json, а во время сборки cmake преобразовать его в строку и после этого использовать

 file (STRINGS "env-config.json" CONFIG)

add_definitions (-DENV_CONFIG=${CONFIG})
  

или, если это так сложно, потому что формат JSON

возможно ли использовать файл свойств, подобный java

db-${env}.properties

с этим содержимым

 db.database.name = mydatabasename
db.database.url = myurl
db.database.user = root
db.database.password = root
  

и включить их вместе внутри исполняемого файла, как в MAP внутри класса конфигурации или структуры

Большое спасибо!

Комментарии:

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

2. Добавьте текст в файл cpp, затем переключитесь в зависимости от конфигурации. Не помещайте конфигурацию в виде макроса, это плохо.

Ответ №1:

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

Смысл наличия файла конфигурации JSON, если я правильно понимаю, заключается в том, чтобы системные администраторы могли настраивать приложение в любое время. Однако внедрение файла JSON в приложение во время сборки означает, что он будет запечен в исполняемый двоичный файл навсегда. Единственный способ внести изменения в файл JSON — это заново перестроить приложение.

Если это то, чего вы хотите, я бы предложил упростить вашу жизнь и сделать конфигурацию заголовочным файлом, который вы можете просто включить в свой исходный код (вместо JSON), подобным этому:

config.h

 #define LATEST_DB_DATABASE "databasename"
#define LATEST_DB_HOST     "hosturl"
#define LATEST_DB_PORT     3306
#define LATEST_DB_USER     "root"
#define LATEST_POOL_MAX    1

#define PROD_DB_DATABASE   "databasename",
#define PROD_DB_HOST       "hosturl"
#define PROD_DB_PORT       3306
#define PROD_DB_USER       "root"
#define PROD_POOL_MAX      1
  

Если это невозможно, то вам нужно написать скрипт сборки на любом языке, который считывает файл JSON и преобразует его в файл заголовка, подобный показанному, и этот заголовок включается в исходный код и компилируется с ним.

Однако, если вы не хотите включать файл JSON во время сборки, вам понадобится библиотека JSON, написанная на C, для чтения файла конфигурации во время выполнения.