如何将rapidjson数组迭代器转换为rapidjson::value?
我不希望答案集中在如何获取快速json数组的内容,或者如何遍历它。
我还非常清楚,我可以使用rapidjson文档itr->name中的示例通过迭代器访问成员,但这也不是我想要的。使用rapidjson数组的这种形式已经出现在许多堆栈溢出问题和rapidjson文档中,并且已经被覆盖。
当我开始使用rapidjson数组迭代器时,我需要以rapidjson::value结束。
如果我们有一个std::vector<int>,那么我们就可以分配
std::vector<int>::iterator itMyInt = myvector.begin();
const int & myInt = *itMyInt;我希望能够用rapidjson数组迭代器做同样的事情,但是我的编译器不同意。
我需要rapidjson::value的原因是,当json对象是数组的元素时,我希望重用相同的解析方法来解析json对象,就像解析对象本身而不是数组中的对象时一样。
让我用我的最小示例来演示:
// Rapid JSON Includes
#include <rapidjson/Document.h>
#include <rapidjson/StringBuffer.h>
#include <rapidjson/writer.h>
// Standard Includes
#include <exception>
#include <string>
#include <sstream>
//--------------------------------------------------------------------------------------------------
// NOTE -This stub cannot change
void ParseCar(const rapidjson::Value & carJson)
{
}
//--------------------------------------------------------------------------------------------------
int main()
{
std::string json =
"{"
" \"cars\" : ["
" {"
" \"name\" : \"Fiat\","
" \"price\" : 19.95"
" },"
" {"
" \"name\" : \"FRS\","
" \"price\" : 19995.00"
" }]"
"}";
// Parse the JSON
rapidjson::Document document;
document.Parse(json.c_str());
if (document.HasParseError())
{
// Error - Failed to parse JSON
std::ostringstream msg;
msg << "There was an error parsing the JSON"
<< " Error Code: " << document.GetParseError()
<< " Error Offset: " << document.GetErrorOffset();
throw std::exception(msg.str().c_str());
}
// Cars array
if (!document.HasMember("cars") ||
!document["cars"].IsArray())
{
std::string msg("Expected \"cars\" JSON array");
throw std::exception(msg.c_str());
}
const rapidjson::Value & carsArrayJSON = document["cars"];
/* Doesn't compile - No GetArray method exists
for (auto & carJSON : carsArrayJSON.GetArray())
{
}
*/
for (rapidjson::Value::ConstMemberIterator itCarJSON = carsArrayJSON.MemberBegin(); itCarJSON != carsArrayJSON.MemberEnd(); ++itCarJSON)
{
// Error - const rapidjson::GenericMember<Encoding,Allocator>' to 'const rapidjson::Value
const rapidjson::Value & carJSON = *itCarJSON;
ParseCar(carJSON);
}
return 0;
}发布于 2018-05-20 10:39:30
MemberIterator迭代对象的成员。ValueIterator迭代数组中的值。
另外,我不确定为什么这个循环会给你带来问题,这段代码为我编译:
std::string json =
"{"
" \"cars\" : ["
" {"
" \"name\" : \"Fiat\","
" \"price\" : 19.95"
" },"
" {"
" \"name\" : \"FRS\","
" \"price\" : 19995.00"
" }]"
"}";
Document doc;
doc.Parse(json.data());
Value const& cars = doc["cars"];
for (auto& car : cars.GetArray()) {
cout << "name: " << car["name"].GetString() << " "
<< "price: " << car["price"].GetFloat() << endl;
}并返回:
name: Fiat price: 19.95
name: FRS price: 19995至于在循环中应用函数:
for (Value& car : cars.GetArray()) {
ParseCar(car);
}如果必须使用迭代器:
for (Value::ValueIterator car = cars.Begin(); car != cars.End(); ++car) {
ParseCar(*car);
}或使用auto:
for (auto car = cars.Begin(); car != cars.End(); ++car) {
ParseCar(*car);
}发布于 2017-06-20 21:07:03
注意:这只在数组中有效。
最近,我遇到了一个类似的问题,我想出了一个不同的方法。
首先,我设置一个指向所需路径的指针,如下所示:
int myIterator = 0;
string myString = "/Layer1/Layer2/" + to_string(myIterator);
Pointer p(myString.c_str());我现在有一个指向JSON对象中随myIterator变化的变量路径的指针。
然后,我使用了一个for循环,在该循环中,我使用SetValueByPointer函数将指针的值附加到一个JSON对象。
https://stackoverflow.com/questions/44420390
复制相似问题