15
{"hi": "hellow",
"first":
    {"next":[
            {"key":"important_value"}
        ]
    }

}

访问数组内的 RapidJSON:

这有效:cout << "HI VALUE:" << variable["hi"].GetString() << endl;这将输出:hellow正如预期的那样,问题是访问内部值,例如如果我想获得“Important_Value”,我尝试过这样的事情:cout << "Key VALUE:" << variable["first"]["next"][0]["key"].GetString() << endl ;但这不起作用,我希望能够获得“important_value” " 由数组的第一项,在这种情况下,它[0]是导致错误的原因。

我该怎么做才能通过它的索引来获取它?我希望我的解释很清楚。

提前致谢。

4

5 回答 5

23

JSON

    {"hi": "hellow", "first":  {"next":[{"key":"important_value"}  ] } }

代码:

rapidjson::Document document;       

if (document.Parse<0>(json).HasParseError() == false)
{
    const Value& a = document["first"];

    const Value& b = a["next"];

    // rapidjson uses SizeType instead of size_t.
    for (rapidjson::SizeType i = 0; i < b.Size(); i++)
    {
        const Value& c = b[i];

        printf("%s \n",c["key"].GetString());
    }        
}

将打印important_value

于 2012-04-06T19:14:58.717 回答
14

[更新]

通过贡献者的巧妙工作,RapidJSON 现在可以消除0字符串与文字的歧义。所以问题不再发生。

https://github.com/miloyip/rapidjson/issues/167


正如 mjean 所指出的,问题是编译器无法通过 literial 来确定是应该调用对象成员访问器还是数组元素访问器0

GenericValue& operator[](const Ch* name)
GenericValue& operator[](SizeType index)

使用[0u]or[SizeType(0)]可以解决这个问题。

解决此问题的另一种方法是停止使用 operator[] 的重载版本。例如,operator()用于一种访问。或使用普通函数,例如GetMember()GetElement()。但我现在对此没有偏好。欢迎提出其他建议。

于 2012-11-14T07:41:39.433 回答
3

我在 tutorial.cpp 文件中注意到了这一点;

// Note:
//int x = a[0].GetInt();         // Error: operator[ is ambiguous, as 0 also mean a null pointer of const char* type.
int y = a[SizeType(0)].GetInt(); // Cast to SizeType will work.
int z = a[0u].GetInt();          // This works too.

我没有测试它,但您可能想尝试其中一种;

变量["first"]["next"][0u]["key"].GetString()

变量["first"]["next"][SizeType(0)]["key"].GetString()

于 2012-04-17T14:47:47.850 回答
0

如果要使用括号访问它,则可以使用以下命令:

int i=0;
cout<<"Key VALUE:"<<variable["first"]["next"][i]["key"].GetString()<<endl ;

输出:键值:important_value

它对我有用。

于 2015-02-05T06:37:36.310 回答
0
auto value = my_array[rapidjson::SizeType(index)].GetFoo();
// replace GetFoo with the type of element you are retrieving, e.g. GetString, GetObject
于 2021-09-10T11:56:01.400 回答