将MemberIterator转换为Value

3

C++中,你可以很容易地从迭代器中获取底层值。例如:

std::vector<int> numbers = { 1, 2, 3, 4, 5 };

for (std::vector<int>::iterator it = numbers.begin(); it != numbers.end(); ++it) {
    int i = *it;
    std::cout << "i = " << i << std::endl;
}

然而,使用rapidjson时,我在从ConstMemberIterator获取底层值方面遇到了困难:
rapidjson::Value* values;
for (rapidjson::Value::ConstMemberIterator it = values->MemberBegin(); it != values->MemberEnd(); ++it) {
    rapidjson::Value v = *it; // ERROR!
}

错误:请求将‘rapidjson :: GenericMemberIterator<true,rapidjson :: UTF8<>,rapidjson :: MemoryPoolAllocatorrapidjson :: CrtAllocator> :: ValueType {aka const rapidjson :: GenericMemberrapidjson :: UTF8<,rapidjson :: MemoryPoolAllocatorrapidjson :: CrtAllocator>}’转换为非标量类型‘rapidjson :: Value {aka rapidjson :: GenericValuerapidjson :: UTF8<>}’

rapidjson :: Value v = * it;

我如何获取基础值,以便我可以对其进行进一步操作?

我找到的唯一方法是将值转换为字符串,然后将字符串重新解析为文档,并通过document [it->name.GetString()]进入,因为似乎也没有将值转换为文档的方法。


MemberBegin 是用于 JSON 值为对象的情况。如果是对象,则可以通过 it->value 获取该值; - Per Ghosh
1个回答

2
如果您正在使用C++11,您可以尝试使用auto...
rapidjson::Value* values;
for (rapidjson::Value::ConstMemberIterator it = values->MemberBegin(); it != values->MemberEnd(); ++it) {
    auto v = *it;
}

1
这里出现了错误:‘rapidjson::GenericMember<Encoding, Allocator>::GenericMember(const rapidjson::GenericMember<Encoding, Allocator>&) [with Encoding = rapidjson::UTF8<>; Allocator = rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>]’在此上下文中是私有的 - graham.reeds
1
这个 auto v = it->value; 有什么不同吗? - Jean-Benoit Harvey
错误:在此上下文中,rapidjson::GenericValue<Encoding, Allocator>::GenericValue(const rapidjson::GenericValue<Encoding, Allocator>&) [with Encoding = rapidjson::UTF8<>; Allocator = rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>]是私有的。 - graham.reeds
我刚意识到这可能与您声明数组的方式有关... rapidjson :: Value类型具有公共的ConstValueIterator属性。但是,使用它不会给您整个数组的迭代器,因为您使用指针声明了数组。您可以尝试更改初始声明,例如std :: vector <rapidjson :: Value> values; - Jean-Benoit Harvey
我最初接收JSON的方式只是通过以下代码:bool ::getValues(rapidjson::Value * values) const; 不幸的是,由于该函数在代码的其他部分中也被使用,因此我无法对函数名称进行太多更改。尽管我个人认为它应该是一个数组,但实际上它并不是。 - graham.reeds
如果您尝试将 rapidjson::Value::ConstMemberIterator it = values->MemberBegin(); 更改为 rapidjson::Value::MemberIterator it = values->MembreBegin();,但无法正常工作,那么了解一下 values 实际包含的信息可能会有所帮助。您可以尝试使用 std::cout 输出 values->MemberCount()values->MemberCapacityvalues->hasMember() 等内容。 - Jean-Benoit Harvey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接