c++ - 如何使用rapidjson C++检索JSON文件中的键值数据?

标签 c++ json rapidjson

我收到了如下 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获取键值数据的解决方案。我发现 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());
            }
        }
    }
}

关于c++ - 如何使用rapidjson C++检索JSON文件中的键值数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34198966/

相关文章:

C++ RapidJSON 解析包裹在回调函数中的 JSON 对象

c++ - 使用 Rapidjson 写入文件

c++ - 在继承的情况下不在此范围内声明

c++ - 在构造函数中复制 __m256d 会导致段错误

json - 如何将 JSON 包集成到 Jade 模板中?

java - java中Json输出添加父节点

c++ - 带字符串的 RapidJson kArrayType

c++ - 没有歧义的标识符

c++ - dlib vs opencv 什么时候使用

c# - 如何将 JSON 包装的集合属性反序列化为泛型类?