这与我问的另一个问题有关,但要具体得多。我需要从我的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++不能做到这一点,我会感到震惊。有人知道该怎么做吗?
发布于 2015-05-17 11:04:55
here回答道。
作为参考,下面的函数片段将打印出任何对象,包括嵌套的对象:
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;
}
}发布于 2015-05-18 06:39:23
以下是有效的方法:
// 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不能用于嵌套字段。
https://stackoverflow.com/questions/30267411
复制相似问题