我在实现递归函数时遇到问题,该函数遍及我从解析json输入得到的树。
json输入。 e.g:
{
"attr" : { "a": 1, "ovec": [ { "b": 2, "c": 3 }, { "d": 4} ] }
}
这就是我们所说的'属性的复合值',而值只是一个JSON doc。它的内容完全是任意的(只要它的有效JSON)。
问题是使用Vector我必须使用Value :: ConstValueIterator类型循环(与Object不同,我使用Value :: ConstMemberIterator)。
我的递归函数将Value :: ConstMemberIterator作为参数,并且在我在Vector中遇到Vector / Object之前一切正常 - 对于递归调用,我需要一个Value :: ConstMemberIterator类型的迭代器。
“遍历”功能的相关部分:
int parseContextAttributeCompoundValue
(
const Value::ConstMemberIterator& node
)
{
std::string type = jsonParseTypeNames[node->value.GetType()];
if (type == "Array")
{
for (Value::ConstValueIterator iter = node->value.Begin(); iter != node->value.End(); ++iter)
{
std::string nodeType = jsonParseTypeNames[iter->value.GetType()];
if (nodeType == "String")
{
val = iter->GetString();
}
// else if ...
if ((nodeType == "Object") || (nodeType == "Array"))
{
// Here's my problem - need to convert 'iter' to Value::ConstMemberIterator
// in order to recursively call parseContextAttributeCompoundValue for this object/array
parseContextAttributeCompoundValue(iter); // COMPILATION ERROR
}
}
}
else if (type == "Object")
{
for (Value::ConstMemberIterator iter = node->value.MemberBegin(); iter != node->value.MemberEnd(); ++iter)
{
std::string nodeType = jsonParseTypeNames[iter->value.GetType()];
if (nodeType == "String")
{
val = iter->value.GetString();
}
else if (nodeType == "Number")
{
if ((nodeType == "Object") || (nodeType == "Array"))
{
// Here I'm just fine as iter is of the desired type already
parseContextAttributeCompoundValue(iter);
}
}
}
}
我尝试过调用iter-> value.MemberBegin()以“转换”为所需类型,但到目前为止没有任何成功
感谢这里的一些帮助...
答案 0 :(得分:1)
您只需调用Value
类型的函数,而不是传递迭代器:
void parseContextAttributeCompoundValue(const Value& v) {
if (v.IsObject()) {
// ...
}
else if (v.IsArray() {
// ...
}
}
然后从通话网站:
for (Value::ConstValueIterator iter = ...) {
parseContextAttributeCompoundValue(*iter);
}
for (Value::ConstMemberIterator iter = ...) {
parseContextAttributeCompoundValue(iter->value);
}