2015-12-10 5 views
1

Я получил строку JSON следующим образом:Как получить данные с ключом в файле JSON с помощью quickjson C++?

{ 
    "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?

+0

Можете ли вы опубликовать журнал ошибок? – bholagabbar

+0

@ShreyansSheth Проблема в том, что я не могу получить значение ключа объекта JSON. – einverne

ответ

0

Наконец-то я нашел решение для получения данных с ключом с помощью quickjson. Я нашел, что 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()); 
      } 
     } 
    } 
}