C++ 如何使用Poco C+从JSON反序列化std::map+;图书馆

C++ 如何使用Poco C+从JSON反序列化std::map+;图书馆,c++,json,c++11,stdmap,poco-libraries,C++,Json,C++11,Stdmap,Poco Libraries,这与我问的另一个问题有关,但要具体得多。我需要从JSON数据中反序列化一个std::map { "name":"john smith" "metadata": { "age":45, "middle_name":"william", }, } 我尝试了很多很多方法来做这件事,但似乎没有任何效果。基于对先前线程的回答,我认为这段代码应该可以工作 std::map myMap; std::string jsonString; // s

这与我问的另一个问题有关,但要具体得多。我需要从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();
std::map myMap;
std::string jsonString;//包含上述JSON的字符串
Poco::JSON::Parser jsonParser;
Poco::Dynamic::Var parsedJSON=jsonParser.parse(jsonString);
Poco::Dynamic::Var parsedResult=jsonParser.result();
Poco::DynamicStruct jsonStruct=*parsedResult.extract();
Poco::Dynamic::Var mapVar=jsonStruct[“stdmap_data”];
for(Poco::Dynamic::Var::conditerator itr=mapVar.begin(),end=mapVar.end();itr!=end;++itr)
myMap[itr->first().toString()]=itr->second().toString();
不幸的是,这个迭代器没有“第一”和“第二”成员。我尝试过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;
    }
}
void objPrint(Object&obj,const std::string&name=”“)
{
对于(Object::conditerator it=obj.begin(),
end=obj.end();it!=end;++it)
{
如果(!name.empty())std::cout first);
}
其他的
std::cout second.toString()以下是有效的方法:

// 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();
}
//从JSON反序列化
void反序列化fromJSON(字符串和jsonString)
{
//解析JSON
Poco::JSON::Parser jsonParser;
Poco::Dynamic::Var parsedJSON=jsonParser.parse(jsonString);
Poco::Dynamic::Var parsedResult=jsonParser.result();
//提取顶级字段
Poco::DynamicStruct jsonStruct=*parsedResult.extract();
name=jsonStruct[“标识符”].toString();
//获取元数据嵌套字段
字符串keyStr=“元数据”;
Poco::JSON::Object::Ptr jsonObject=parsedResult.extract();
Poco::Dynamic::Var metaVar=jsonObject->get(keyStr);
Poco::JSON::Object::Ptr metaObj=metaVar.extract();
对于(Poco::JSON::Object::conditerator itr=metaObj->begin(),end=metaObj->end();itr!=end;++itr)
元数据[itr->first]=itr->second.toString();
}

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

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