【问题标题】:How to deserialize a std::map from JSON using the Poco C++ libraries如何使用 Poco C++ 库从 JSON 反序列化 std::map
【发布时间】:2015-05-15 19:33:04
【问题描述】:

这与我提出的另一个问题有关,但更具体。我需要从我的 JSON 数据中反序列化一个 std::map。

{
    "name":"john smith"
    "metadata":
    {
        "age":45,
        "middle_name":"william",
    },
}

我已经尝试了很多很多方法来做到这一点,但似乎没有任何效果。根据对先前线程的回答,我认为这段代码应该可以工作。

std::map myMap;
std::string jsonString; // string containing the above JSON
Poco::JSON::Parser jsonParser;
Poco::Dynamic::Var parsedJSON = jsonParser.parse(jsonString);
Poco::Dynamic::Var parsedResult = jsonParser.result();
Poco::DynamicStruct jsonStruct = *parsedResult.extract<Poco::JSON::Object::Ptr>();
Poco::Dynamic::Var mapVar = jsonStruct["stdmap_data"];
for (Poco::Dynamic::Var::ConstIterator itr = mapVar.begin(), end = mapVar.end(); itr != end; ++itr)
    myMap[itr->first().toString()] = itr->second().toString();

不幸的是,这个迭代器没有“first”和“second”成员。我试过 DynamicStruct(同样的问题)和 JSON::Object(不能/不会从 jsonStruct["stdmap_data"] 转换)。

这在 JSON 数据中似乎很常见,所以如果 Poco C++ 不能做到这一点,我会感到震惊。有人知道应该怎么做吗?

【问题讨论】:

    标签: c++ json c++11 stdmap poco-libraries


    【解决方案1】:

    已回复here

    作为参考,这里的函数 sn-p 将打印出任何对象,包括嵌套对象:

    void objPrint(Object& obj, const std::string& name = "")
    {
        for (Object::ConstIterator it = obj.begin(),
            end = obj.end(); it != end; ++it)
        {
            if (!name.empty()) std::cout << name << ':';
            std::cout << it->first << ':';
            if (it->second.type() == typeid(Object::Ptr))
            {
                Object::Ptr p = it->second.extract<Object::Ptr>();
                objPrint(*p, it->first);
            }
            else
                 std::cout << it->second.toString() << std::endl;
        }
    }
    

    【讨论】:

    • 我应该将上面的哪些变量传递给“objPrint”函数?没有 JSON::Object 可供我传递给函数。
    • 此代码没有回答问题,因为它没有显示如何将嵌套数据提取到 std::map 中。此外,当我尝试使用此代码时,我得到 "poco\include\poco\dynamic\var.h(199): error C2664: 'void Poco::Dynamic::VarHolder::convert(Poco::UTF16String &) const ' : 无法将参数 1 从 'Poco::JSON::Object' 转换为 'Poco::Int8 &'"
    【解决方案2】:

    以下是有效的:

    // Deserialize from JSON
    void DeserializeFromJSON(string &jsonString)
    {
        // Parse the JSON
        Poco::JSON::Parser jsonParser;
        Poco::Dynamic::Var parsedJSON = jsonParser.parse(jsonString);
        Poco::Dynamic::Var parsedResult = jsonParser.result();
    
        // Extract top-level fields
        Poco::DynamicStruct jsonStruct = *parsedResult.extract<Poco::JSON::Object::Ptr>();
        name = jsonStruct["identifier"].toString();
    
        // Get metadata nested fields
        string keyStr = "metadata";
        Poco::JSON::Object::Ptr jsonObject = parsedResult.extract<Poco::JSON::Object::Ptr>();
        Poco::Dynamic::Var metaVar = jsonObject->get(keyStr);
        Poco::JSON::Object::Ptr metaObj = metaVar.extract<Poco::JSON::Object::Ptr>();
        for (Poco::JSON::Object::ConstIterator itr = metaObj->begin(), end = metaObj->end(); itr != end; ++itr)
            metaData[itr->first] = itr->second.toString();
    }
    

    DynamicStruct 似乎不能用于嵌套字段。

    猜你喜欢
    • 2013-04-11
    • 2012-06-22
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多