微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Poco::Dynamic::Var 由操作符 [] 创建空对象

如何解决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 } }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。