如何使用Poco c++库从JSON反序列化std::map
How to deserialize a std::map from JSON using the Poco C++ libraries
这与我问的另一个问题有关,但更具体。我需要从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不能用于嵌套字段
相关文章:
- 如何知道QDataStream不能反序列化某些内容
- 增强基于 XML class_id的反序列化
- 提升反序列化对象具有 nan 或 -nan 值
- 如何在 c++ 非托管代码中反序列化 byte[] 的 json 字符串?
- 如何反序列化数组?
- Protobuf中重复字段的问题.使用重复字段进行序列化/反序列化的更好方法是什么?
- 通过 tcp 发送 C# 类并在 C++ 上反序列化
- 序列化和反序列化boost共享指针
- 在C++中使用POCO和grain对多个对象进行反序列化
- C++中整数向量的序列化/反序列化
- 使用 Json 转换器反序列化 WCF 服务中的C++字符串
- 使用 QDataStream 对原始数据进行反序列化
- 使用协议缓冲区创建通用反序列化程序
- 从 boost::存档:binary_iarchive 反序列化 std::string 时出现错误的分配异常
- 提升序列化:SIGABRT 同时反序列化包含 std::shared_ptr 的对象上的 boost::shared_p
- 如何通过 C++ boost::序列化执行 std::map 的部分反序列化
- C++ 序列化/反序列化 std::map<int,int> from/to file
- 如何使用boost::unordered_map的boost std::vector进行序列化/反序列化
- 无法反序列化 std::list<std::string>
- 如何使用Poco c++库从JSON反序列化std::map