2

我在实现一个递归函数时遇到了问题,该函数遍历了我从解析 json 输入获得的树。

json输入。例如:

{
  "attr" : { "a": 1, "ovec": [ { "b": 2, "c": 3 }, { "d": 4} ] }
}

这就是我们所说的“属性的复合值”,该值只是一个 JSON 文档。它的内容是完全任意的(只要它的 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() 以“转换”为所需的类型,但到目前为止没有任何成功

非常感谢这里的一些帮助......

4

1 回答 1

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);
}
于 2015-08-05T01:56:02.927 回答