首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Poco C++库从JSON反序列化std::map

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

Stack Overflow用户
提问于 2015-05-16 03:33:05
回答 2查看 1.7K关注 0票数 0

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

代码语言:javascript
复制
{
    "name":"john smith"
    "metadata":
    {
        "age":45,
        "middle_name":"william",
    },
}

我试过很多很多的方法,但似乎都不管用。基于对前一个线程的回答,我认为这段代码应该可以工作。

代码语言:javascript
复制
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++不能做到这一点,我会感到震惊。有人知道该怎么做吗?

EN

回答 2

Stack Overflow用户

发布于 2015-05-17 11:04:55

here回答道。

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

代码语言:javascript
复制
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;
    }
}
票数 0
EN

Stack Overflow用户

发布于 2015-05-18 06:39:23

以下是有效的方法:

代码语言:javascript
复制
// 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不能用于嵌套字段。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30267411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档