json 入力の解析から取得したツリーを超える再帰関数の実装に問題があります。
json 入力。例えば:
{
"attr" : { "a": 1, "ovec": [ { "b": 2, "c": 3 }, { "d": 4} ] }
}
これは「属性の複合値」と呼ばれるもので、値は単なる JSON ドキュメントです。その内容は完全に任意です (有効な JSON である限り)。
問題は、Vector の場合、Value::ConstValueIterator 型を使用してループする必要があることです (Value::ConstMemberIterator を使用する Object とは異なります)。
私の再帰関数にはパラメーターとして 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() を呼び出して目的の型に「変換」するなど、いくつか試しましたが、これまでのところ成功していません
ここで助けてくれてありがとう...