2016-11-26 2 views
0

У меня есть JSON, который я хочу проверить с помощью FindMember, а затем получить его. , но проблема в том, что он действительно найти «название» строку НО это не возвращают rapidjson :: ЗначениеRapidJSON Как получить объект-член при использовании FindMember

[{ 
     "title" : "one", 
     "type" : "gg", 
     "center" : {  
     }, 
}] 



rapidjson::Document document; 
if(!document.Parse(jsonContent.c_str()).HasParseError()) 
{ 
     if (document.IsArray()) 
     { 
      for (rapidjson::SizeType i = 0; i < document.Size(); i++) 
      { 
       rapidjson::Value& findMemberInJsonNode = FindMemberInJsonNode(&document[i], "title"); 

      } 
     } 
} 



rapidjson::Value& HelloWorld::FindMemberInJsonNode(rapidjson::Value* jsonValue,std::string str) 
{ 
    rapidjson::Value::MemberIterator localMemberItr = jsonValue->FindMember(str.c_str()); 
    //create null 
    rapidjson::Value &val = rapidjson::Value::GenericValue(); 
    if (localMemberItr != jsonValue->MemberEnd()) 
    { 
//IT IS ENTER HERE SO it DOES FIND THE "title" STRING 
     val = localMemberItr->value; 
     if (val.IsNull()) 
     { 
      int s = 1; 
     } 
     else if (val.IsObject()) 
     { 
      int s = 0; 
     } 
    } 
    //IT IS NULL 
    return val; 
} 

ответ

1

Вы можете просто вернуть localMemberItr->value, когда член был найден.

Но проблема в том, что он должен вернуть, когда элемент не был найден.

Возможное решение - вернуть указатель вместо ссылки. Таким образом, вы можете вернуть &localMemberItr->value, когда участник был найден, и nullptr (или 0), если он не был найден.

Кроме того, с помощью JSON pointer он уже сделал то, что вы сделали:

#include <rapidjson/pointer.h> 

/* ... */ 

Pointer titlePointer("/title"); 
if (document.IsArray()) { 
    for (rapidjson::SizeType i = 0; i < document.Size(); i++) { 
     if (Value* title = titlePointer.Get(documents[i]) { 
      // "title" was found and the value is pointed by title 
     } 
    } 
} 
+0

Почему они показывают HasMember в rapidjson сайте учебника, но люди переборе, как это, существует ли член? Я пытаюсь заставить HasMember работать. – Michele

+1

Использование FindMember() может получить значение одновременно, в то время как HasMember() может возвращать только bool. Использование FindMember() предотвращает поиск структуры данных дважды, если вам нужно значение в конце. –

Смежные вопросы