c++ - Poco::Dynamic::Var 通过运算符 [] 创建了空对象
问题描述
我尝试检查 Poco::Dynamic::Var 中是否存在参数。但检查后我发现源对象已更改。出现了一个新参数,我检查了它。
问题:
如何在不修改源对象的情况下检查 Poco::Dynamic::Var 中是否存在参数。
代码示例:
void checkParamInConfig(Poco::Dynamic::Var &conf) {
std::cout << "before:" << conf.toString() << std::endl;
// new key problem
if (conf["Configuration"]["NewParam"].isEmpty()) {
std::cout<<"NewParam not found"<<std::endl;
}
std::cout << "after:" << conf.toString() << std::endl;
}
输出:
before:{ "Configuration" : { "Param1" : true, "Param2" : true, "Param3" : true } }
NewParam not found
after:{ "Configuration" : { "NewParam" : null, "Param1" : true, "Param2" : true, "Param3" : true } }
解决方案
Poco::Dynamic::Var
没有find()
函数,但Poco::Dynamic::Struct
有find()
and contains()
。
您需要从中提取Struct
值,Var
如下所示:
void checkParamInConfig(Poco::Dynamic::Var &conf)
{
std::cout << "before:" << conf.toString() << std::endl;
auto params = conf["Configuration"];
if (params.isStruct())
{
auto p = params.extract<Poco::Dynamic::Struct<std::string>>();
if (!p.contains("NewParam"))
{
std::cout << "NewParam not found" << std::endl;
}
}
std::cout << "after:" << conf.toString() << std::endl;
}
输出:
before:{ "Configuration" : { "Param1" : true, "Param2" : true, "Param3" : true } }
NewParam not found
after:{ "Configuration" : { "Param1" : true, "Param2" : true, "Param3" : true } }