首页 > 解决方案 > 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 } }  

标签: c++jsonc++11c++14poco-libraries

解决方案


Poco::Dynamic::Var没有find()函数,但Poco::Dynamic::Structfind()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 } }

推荐阅读