如何使用 rapidjson C++ 检索 JSON 文件中的键值数据?
How to retrieve key-value data in JSON file using rapidjson C++?
我收到了一个 JSON 字符串如下:
{
"ret":"xxx",
"error": [
{
"errors": {"0":"0.2", "1":"0.3" }
},
{
"errors": {"2":"0.2", "3":"0.4" }
}
]
}
我已经编写了代码来获取所有其他值,但我不知道如何获取 errors
字段。我注意到 errors
字段是一个类似键值散列的对象。但问题是,这个类散列对象中的所有键都在变化。
我找到了这个 question。它使用的是MemberIterator
,但是当我使用这个函数时,总是出现错误。
我的一些代码在这里:
ret = "{\"ret\":\"101\",\"error\":[{\"errortype\":\"A0001\",\"errorstroke\":{\"0\":\"0.2\",\"1\":\"0.3\"}},{\"errortype\":\"A0021\",\"errorstroke\":{\"0\":\"0.2\",\"1\":\"0.3\"}}]}" ;
rapidjson::Document doc;
doc.Parse <kParseDefaultFlags>( ret.c_str ());
if(doc .HasMember( "ret")){
string retjson = doc["ret" ].GetString();
for ( unsigned i = 0; i < retjson. length(); ++i)
{
CCLog("%c\t" ,retjson. at(i ));
}
}
if ( doc.HasMember ("error"))
{
const Value & errorjson = doc["error" ];
for ( SizeType i = 0 ; i < errorjson .Size(); ++i )
{
if(errorjson [i]. HasMember("errortype" )){
string errortype = errorjson[i ]["errortype"]. GetString();
}
if(errorjson [i]. HasMember("errorstroke" )){
for ( Value::ConstValueIterator iter = errorjson[i ]["errorstroke"]. onBegin; iter != errorjson[i ]["errorstroke"]. onEnd(); ++iter)
{
for ( Value::MemberIterator m = iter->MemberBegin (); m != iter->MemberEnd (); ++ m)
{
}
}
}
}
}
错误发生在Value::MemberIterator
。我该如何解决或者JSON结构设计有问题?
终于找到了使用rapidjson获取key-value数据的方案。我发现 ConstMemberIterator
用于在对象中迭代的迭代器。假设 membersObject 是一个包含键值数据的 JSON 对象。我可以像这样检索数据。
const rapidjson::Value& membersObject;
for(rapidjson::Value::ConstMemberIterator it=membersObject.MemberBegin(); it != membersObject.MemberEnd(); it++) {
cout << it->name << endl;
cout << it->value << endl;
}
所以我最后的程序是这样的:
string ret = "{\"ret\":\"101\",\"error\":[{\"errortype\":\"A0001\",\"errorstroke\":{\"0\":\"0.2\",\"1\":\"0.3\"}},{\"errortype\":\"A0021\",\"errorstroke\":{\"0\":\"0.2\",\"1\":\"0.3\"}}]}";
rapidjson::Document doc;
doc.Parse<kParseDefaultFlags>(ret.c_str());
if(doc.HasMember("ret")){
string retjson = doc["ret"].GetString();
for (unsigned i = 0; i < retjson.length(); ++i)
{
printf("%c\t",retjson.at(i));
cout << retjson << endl;
}
}
if (doc.HasMember("error"))
{
const Value& errorjson = doc["error"];
for (SizeType i = 0 ; i < errorjson.Size(); ++i)
{
if(errorjson[i].HasMember("errortype")){
string errortype = errorjson[i]["errortype"].GetString();
}
if(errorjson[i].HasMember("errorstroke")){
const Value& et = errorjson[i]["errorstroke"];
for (Value::ConstMemberIterator iter = et.MemberBegin(); iter != et.MemberEnd(); ++iter)
{
printf("%s\t",iter->name.GetString());
printf("%s\t",iter->value.GetString());
}
}
}
}
我收到了一个 JSON 字符串如下:
{
"ret":"xxx",
"error": [
{
"errors": {"0":"0.2", "1":"0.3" }
},
{
"errors": {"2":"0.2", "3":"0.4" }
}
]
}
我已经编写了代码来获取所有其他值,但我不知道如何获取 errors
字段。我注意到 errors
字段是一个类似键值散列的对象。但问题是,这个类散列对象中的所有键都在变化。
我找到了这个 question。它使用的是MemberIterator
,但是当我使用这个函数时,总是出现错误。
我的一些代码在这里:
ret = "{\"ret\":\"101\",\"error\":[{\"errortype\":\"A0001\",\"errorstroke\":{\"0\":\"0.2\",\"1\":\"0.3\"}},{\"errortype\":\"A0021\",\"errorstroke\":{\"0\":\"0.2\",\"1\":\"0.3\"}}]}" ;
rapidjson::Document doc;
doc.Parse <kParseDefaultFlags>( ret.c_str ());
if(doc .HasMember( "ret")){
string retjson = doc["ret" ].GetString();
for ( unsigned i = 0; i < retjson. length(); ++i)
{
CCLog("%c\t" ,retjson. at(i ));
}
}
if ( doc.HasMember ("error"))
{
const Value & errorjson = doc["error" ];
for ( SizeType i = 0 ; i < errorjson .Size(); ++i )
{
if(errorjson [i]. HasMember("errortype" )){
string errortype = errorjson[i ]["errortype"]. GetString();
}
if(errorjson [i]. HasMember("errorstroke" )){
for ( Value::ConstValueIterator iter = errorjson[i ]["errorstroke"]. onBegin; iter != errorjson[i ]["errorstroke"]. onEnd(); ++iter)
{
for ( Value::MemberIterator m = iter->MemberBegin (); m != iter->MemberEnd (); ++ m)
{
}
}
}
}
}
错误发生在Value::MemberIterator
。我该如何解决或者JSON结构设计有问题?
终于找到了使用rapidjson获取key-value数据的方案。我发现 ConstMemberIterator
用于在对象中迭代的迭代器。假设 membersObject 是一个包含键值数据的 JSON 对象。我可以像这样检索数据。
const rapidjson::Value& membersObject;
for(rapidjson::Value::ConstMemberIterator it=membersObject.MemberBegin(); it != membersObject.MemberEnd(); it++) {
cout << it->name << endl;
cout << it->value << endl;
}
所以我最后的程序是这样的:
string ret = "{\"ret\":\"101\",\"error\":[{\"errortype\":\"A0001\",\"errorstroke\":{\"0\":\"0.2\",\"1\":\"0.3\"}},{\"errortype\":\"A0021\",\"errorstroke\":{\"0\":\"0.2\",\"1\":\"0.3\"}}]}";
rapidjson::Document doc;
doc.Parse<kParseDefaultFlags>(ret.c_str());
if(doc.HasMember("ret")){
string retjson = doc["ret"].GetString();
for (unsigned i = 0; i < retjson.length(); ++i)
{
printf("%c\t",retjson.at(i));
cout << retjson << endl;
}
}
if (doc.HasMember("error"))
{
const Value& errorjson = doc["error"];
for (SizeType i = 0 ; i < errorjson.Size(); ++i)
{
if(errorjson[i].HasMember("errortype")){
string errortype = errorjson[i]["errortype"].GetString();
}
if(errorjson[i].HasMember("errorstroke")){
const Value& et = errorjson[i]["errorstroke"];
for (Value::ConstMemberIterator iter = et.MemberBegin(); iter != et.MemberEnd(); ++iter)
{
printf("%s\t",iter->name.GetString());
printf("%s\t",iter->value.GetString());
}
}
}
}