{"hi": "hellow",
"first":
{"next":[
{"key":"important_value"}
]
}
}
在数组中访问RapidJSON:
这有效:cout << "HI VALUE:" << variable["hi"].GetString() << endl;
这将按预期输出:hellow
,问题是访问内部值,如果我想获得“Important_Value”,我尝试过这样的事情:{{1}但是这不起作用,我希望能够通过数组的第一项得到“important_value”,在这种情况下,导致错误的是cout << "Key VALUE:" << variable["first"]["next"][0]["key"].GetString() << endl ;
。
如何通过索引获取它? 我希望我的解释清楚。
提前致谢。
答案 0 :(得分:21)
JSON
{"hi": "hellow", "first": {"next":[{"key":"important_value"} ] } }
代码:
rapidjson::Document document;
if (document.Parse<0>(json).HasParseError() == false)
{
const Value& a = document["first"];
const Value& b = a["next"];
// rapidjson uses SizeType instead of size_t.
for (rapidjson::SizeType i = 0; i < b.Size(); i++)
{
const Value& c = b[i];
printf("%s \n",c["key"].GetString());
}
}
将打印 important_value
答案 1 :(得分:13)
[更新]
通过贡献者的聪明工作,RapidJSON现在可以从字符串中消除文字0
的歧义。所以这个问题不再发生了。
https://github.com/miloyip/rapidjson/issues/167
问题,正如mjean指出的那样,编译器无法通过升级0
来确定它是应该调用对象成员访问器还是数组元素访问器:
GenericValue& operator[](const Ch* name)
GenericValue& operator[](SizeType index)
使用[0u]
或[SizeType(0)]
可以解决此问题。
解决此问题的另一种方法是停止使用operator []的重载版本。例如,使用operator()
进行一种访问。或使用常规功能,例如GetMember()
,GetElement()
。但我现在对此没有偏好。欢迎提出其他建议。
答案 2 :(得分:2)
我在tutorial.cpp文件中注意到了这一点;
// Note:
//int x = a[0].GetInt(); // Error: operator[ is ambiguous, as 0 also mean a null pointer of const char* type.
int y = a[SizeType(0)].GetInt(); // Cast to SizeType will work.
int z = a[0u].GetInt(); // This works too.
我没有测试它,但你可能想尝试其中一种;
变量[ “第一”] [ “下一个”] [0U] [ “钥匙”]。GetString的()
变量[ “第一”] [ “下一个”] [的SizeType(0)] [ “钥匙”]。GetString的()
答案 3 :(得分:0)
如果要使用括号访问它,则可以使用以下内容:
int i=0;
cout<<"Key VALUE:"<<variable["first"]["next"][i]["key"].GetString()<<endl ;
输出:键值:important_value
它对我有用。