首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将rapidjson数组迭代器转换为rapidjson::value

将rapidjson数组迭代器转换为rapidjson::value
EN

Stack Overflow用户
提问于 2017-06-08 02:38:25
回答 2查看 2.5K关注 0票数 2

如何将rapidjson数组迭代器转换为rapidjson::value?

我不希望答案集中在如何获取快速json数组的内容,或者如何遍历它。

我还非常清楚,我可以使用rapidjson文档itr->name中的示例通过迭代器访问成员,但这也不是我想要的。使用rapidjson数组的这种形式已经出现在许多堆栈溢出问题和rapidjson文档中,并且已经被覆盖。

当我开始使用rapidjson数组迭代器时,我需要以rapidjson::value结束。

如果我们有一个std::vector<int>,那么我们就可以分配

代码语言:javascript
复制
std::vector<int>::iterator itMyInt = myvector.begin();
const int & myInt = *itMyInt;

我希望能够用rapidjson数组迭代器做同样的事情,但是我的编译器不同意。

我需要rapidjson::value的原因是,当json对象是数组的元素时,我希望重用相同的解析方法来解析json对象,就像解析对象本身而不是数组中的对象时一样。

让我用我的最小示例来演示:

代码语言:javascript
复制
// 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;
}
EN

回答 2

Stack Overflow用户

发布于 2018-05-20 10:39:30

MemberIterator迭代对象的成员。ValueIterator迭代数组中的值。

另外,我不确定为什么这个循环会给你带来问题,这段代码为我编译:

代码语言:javascript
复制
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;
}

并返回:

代码语言:javascript
复制
name: Fiat price: 19.95
name: FRS price: 19995

至于在循环中应用函数:

代码语言:javascript
复制
for (Value& car : cars.GetArray()) {
    ParseCar(car);
}

如果必须使用迭代器:

代码语言:javascript
复制
for (Value::ValueIterator car = cars.Begin(); car != cars.End(); ++car) {
    ParseCar(*car);
}

或使用auto:

代码语言:javascript
复制
for (auto car = cars.Begin(); car != cars.End(); ++car) {
    ParseCar(*car);
}
票数 1
EN

Stack Overflow用户

发布于 2017-06-20 21:07:03

注意:这只在数组中有效。

最近,我遇到了一个类似的问题,我想出了一个不同的方法。

首先,我设置一个指向所需路径的指针,如下所示:

代码语言:javascript
复制
int myIterator = 0;
string myString = "/Layer1/Layer2/" + to_string(myIterator);
Pointer p(myString.c_str());

我现在有一个指向JSON对象中随myIterator变化的变量路径的指针。

然后,我使用了一个for循环,在该循环中,我使用SetValueByPointer函数将指针的值附加到一个JSON对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44420390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档