我正在使用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既不提供转换为迭代器也不提供“!=”运算符的覆盖。
答案 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;
}