通过索引访问 rapidjson::D ocument array

Accessing rapidjson::Document array by index

本文关键字:array ocument rapidjson 索引 访问      更新时间:2023-10-16

我有这个代码:

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"];
}