Jsonxx - 迭代Json

时间:2016-01-29 17:50:26

标签: c++ json

我正在使用Jsonxx library 我需要迭代一些json值,例如:

    {
        "unknowName1" : { "foo" : bar }
        "unknowName2" : { "foo" : bar }
    }

很明显我需要某种迭代器,但是我不能这样做而且jsonxx不是很流行或者文档很丰富。不幸的是我无法使用其他json库。 我试过这个:

    Object o;
    o.parse(json);
    std::map<std::string, Value*> * jsonMap = o.kv_map;
    typedef std::map<std::string, std::map<std::string, std::string>>::iterator it_type;
    for (it_type iterator = jsonMap->begin(); iterator != jsonMap->end(); iterator++) 
    {
    doing stuff here
    }

但是jsonxx既不提供转换为迭代器也不提供“!=”运算符的覆盖。

2 个答案:

答案 0 :(得分:2)

  

但是jsonxx既没有提供转换为迭代器也没有覆盖&#34;!=&#34;操作

这是一种误解。 jsonxx无需覆盖任何内容。它们的实现只适用于标准的c ++容器实现。

从他们(确实记录不佳)的界面看起来你需要一个const_iterator实际

typedef std::map<std::string, std::map<std::string, Value*>>::const_iterator it_type;
                                                                 // ^^^^^^^^

kv_map()函数返回const std::map<std::string, Value*>&

  

标题中的签名:

const std::map<std::string, Value*>& kv_map() const;

你也需要改变

std::map<std::string, Value*> * jsonMap = o.kv_map;

const std::map<std::string, Value*>& jsonMap = o.kv_map();
                                // ^                   ^^ it's a function, so call it
                                // | there's no pointer returned but a const reference

使语法正确。

最后循环应如下所示:

for (it_type iterator = jsonMap.begin(); iterator != jsonMap.end(); ++iterator) {
     // doing stuff here
}

答案 1 :(得分:2)

如果你正在使用C ++ 11及更高版本,你可以使用自动初始化非常轻松地进行迭代,导致类似这样的事情:

for(auto kv : o.kv_map)
{
    jsonxx::Object obj = kv.second->get<jsonxx::Object>();
    // do stuff here
    std::cout << obj.json() << std::endl;
}