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,"Param3" : true } }  

解决方法

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