C++使用jsoncpp时如何从JSON::Value类型参数获取对应键名
问题场景
- 程序启动时从JSON文件加载配置,为保证文件包含所有必填配置键,会逐个校验JSON键的存在性,校验结果写入布尔变量
config_is_valid。只要任意键缺失导致该值为false,就打印错误信息并终止程序运行。 - 需求:在
check_config_value(...)函数内部,直接从传入的param参数中获取对应的JSON键名,在控制台打印缺失的键名,且不修改调用方代码逻辑——由于有上百个配置值,不想每次单独校验check_config_value()的返回值。
当前实现代码如下:
bool config_is_valid = true; VARIABLES::config::first_config_value = check_config_value(system_config["first_layer"]["keyname_i_want_to_know"], config_is_valid).asBool(); VARIABLES::config..... Json::Value check_config_value(Json::Value param, bool& validity) { if (param == Json::Value::null) { validity = false; } return param; }
解决方案
首先明确核心限制:Json::Value对象本身不存储自身对应的键名信息,当你通过[]运算符链式取子节点时,最终拿到的子节点Value中不会保留任何父节点路径、自身键名的相关信息,因此仅靠当前的函数入参不可能直接获取到键名。
要满足「改动量极小、无需逐个编写校验逻辑、自动打印缺失键名」的需求,最简便的实现方式是通过宏做一层包装,利用宏的预处理特性自动获取传入的配置取值表达式的字符串内容,再传给校验函数打印。
具体实现代码如下:
#include <iostream> // 给校验函数新增参数,接收键路径字符串 Json::Value check_config_value(Json::Value param, bool& validity, const char* key_path) { if (param == Json::Value::null) { validity = false; // 直接打印缺失的配置项路径 std::cerr << "配置加载错误:缺失必填配置项 " << key_path << std::endl; } return param; } // 定义宏包裹校验逻辑,自动将传入的配置索引表达式转为字符串传入 #define CHECK_CONFIG(expr, is_valid) check_config_value(expr, is_valid, #expr)
原有调用代码仅需要做全局替换,把check_config_value替换为宏名CHECK_CONFIG即可,其余逻辑完全不用改动:
bool config_is_valid = true; VARIABLES::config::first_config_value = CHECK_CONFIG(system_config["first_layer"]["keyname_i_want_to_know"], config_is_valid).asBool(); // 其余上百处配置加载逻辑都只需要替换函数名为宏名,无需额外传参或写校验逻辑
当对应配置键缺失时,控制台会直接输出类似如下的错误信息:
配置加载错误:缺失必填配置项 system_config["first_layer"]["keyname_i_want_to_know"]
如果觉得打印内容带system_config前缀冗余,可以在宏或者校验函数里加简单的字符串截断逻辑,只保留后续的键路径部分即可,不影响核心功能。
内容的提问来源于stack exchange,提问作者gear
相关产品推荐
相关产品推荐

