如何使用Poco c++库从JSON反序列化std::map

How to deserialize a std::map from JSON using the Poco C++ libraries

本文关键字:反序列化 std JSON map 库从 何使用 Poco c++      更新时间:2023-10-16

这与我问的另一个问题有关,但更具体。我需要从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"answers"second"成员。我试过DynamicStruct(同样的问题)和JSON::Object(不能/不会从jsonStruct["stdmap_data"]转换)。

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

回答这里

作为参考,下面是打印任何对象(包括嵌套对象)的函数片段:

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;
    }
}

方法如下:

// 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不能用于嵌套字段