通过索引访问 rapidjson::D ocument array
Accessing rapidjson::Document array by index
我有这个代码:
Document dataDoc;
dataDoc.SetArray();
Document::AllocatorType &allocator = dataDoc.GetAllocator();
for (size_t i = 0; i < 10; ++i)
{
ostringstream ss;
ss << "set_" << i + 1 << "_data";
Document doc;
doc.Parse<0>(UserDefault::getInstance()->getStringForKey(ss.str().c_str()).c_str());
dataDoc.PushBack(doc, allocator);
}
有一个rapidjson::Document
"dataDoc",我把它转换成一个数组。然后,我用Document
对象填充数组,这些对象包含从cocos2d::UserDefault
获取并适当解析的 JSON 对象。
这是添加到 dataDoc 的 JSON 对象:
{
"people": [
{
"name": "Peter",
"phone": "123",
"address": "Address 456"
},
{
"name": "Helen",
"phone": "123",
"address": "Address 456"
},
{
"name": "John",
"phone": "123",
"address": "Address 456"
}
]
}
现在 dataDoc 数组包含 10 个这样的对象。
我知道我可以像这样处理一个对象:
Document doc;
rapidjson::Value &people = doc["people"];
string name = people[0]["name"].GetString();
但是,例如,如何通过索引访问dataDoc数组中的第一个对象并获取上述名称值?
编辑
也尝试使用此代码:
vector<string> jsons;
jsons.push_back("{"people":[{"name":"Peter","phone":"123","address":"Address 456"},{"name":"Helen","phone":"123","address":"Address 456"},{"name":"John","phone":"123","address":"Address 456"}]}");
jsons.push_back("{"people":[{"name":"Peter","phone":"123","address":"Address 456"},{"name":"Helen","phone":"123","address":"Address 456"},{"name":"John","phone":"123","address":"Address 456"}]}");
jsons.push_back("{"people":[{"name":"Peter","phone":"123","address":"Address 456"},{"name":"Helen","phone":"123","address":"Address 456"},{"name":"John","phone":"123","address":"Address 456"}]}");
Document dataDoc;
dataDoc.SetArray();
Document::AllocatorType &allocator = dataDoc.GetAllocator();
for (size_t i = 0; i < 3; ++i)
{
Document doc;
doc.Parse<0>(jsons.at(i).c_str());
dataDoc.PushBack(doc, allocator);
}
auto &people = dataDoc[0]["people"];
但它给了我同样的错误。它指向位于...cocos2dexternaljson
的 "document.h" 中的第 1688 行。
首先,您的代码在创建doc
的方式中似乎存在问题 - 您需要提供dataDoc
的分配器:
Document doc(&allocator);
然后,rapidjson::Document
继承自rapidjson::Value
,因此您可以简单地将其视为值并使用[]
运算符:
auto &people = dataDoc[0]["people"];
您还可以循环访问整个文档:
for (auto &doc: dataDoc.getArray()) {
auto &people = doc["people"];
}
在 C++11 之前:
for (Value::ConstValueIterator itr = dataDoc.Begin();
itr != dataDoc.End(); ++itr) {
auto &people = (*itr)["people"];
}
相关文章:
- C++11 中不同类型的对象的 std::array 的替代方案
- constexpr begin of a std::array
- C++如果必须在编译时确定大小,std::array 有什么意义?
- OpenGL VBO Indexing ( How to compute Index Array)
- 标准::unordered_map 中的 std::array 的值初始化
- "Warning: Comma within array index expression"但逗号分隔函数参数
- 确保编译时的特定 std::array 位置
- std::array的长度有大小限制吗?
- 将 std::array 移动到另一个 std::array
- 首先按给定顺序打印所有数字,然后使用 Array 打印所有字符和其他符号
- 为什么 std::shared_ptr 被认为是"heavy"和"expensive",但 std::array "same perfprmance as plain (c-style) arrays
- 将 **float array 从 C++ Dll 传递给 python
- std::bind on statd::array 的运算符 []
- 检查输入 std::array 指针数据是否等于某个常量数组
- 我可以安全地复制矢量<array>吗?
- 解析问题 - 预期的非限定 ID - #include <array> 编译错误
- 如何读/写或遍历 std::array 中的特定元素范围?
- 通过 host() 从 af::array 检索数据会导致错误的数据
- 是否可以使用 std::array 作为 POD 结构的数据容器?
- 通过索引访问 rapidjson::D ocument array