如何在构建时将JSON文件/对象包含在C ++中

时间:2019-03-22 20:03:24

标签: c++ c json cmake

我有一个名为env-config.json的具有数据库环境配置的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崩溃,因为所有scape都来自json,是的,我可以将json放在具有很多\ n和scapes的字符串格式中,但是我会会丢失json格式。

例如,可以将我的json文件完整保存为json格式,并在构建时将其转换为字符串,然后使用

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 个答案:

答案 0 :(得分:0)

我或者误解了您的用例,或者您错过了在构建时包含文件的重要要点。

如果我理解正确,那么拥有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文件,那么您将需要一个用C编写的JSON库以在运行时读取配置文件。