2016-11-26 5 views
0

私はFindMemberを使用してそれを検証し、それを受け取るJSONを持っています。 しかし、問題は、それが「タイトル」の文字列 を見つけるかということですが、それは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

彼らはなぜrapidjsonウェブサイトのチュートリアルでHasMemberを示さないが、人々は、メンバーが存在するかどうかを確認するために、次のように反復されていますか?私はHasMemberを働かせようとしています。 – Michele

+1

FindMember()を使用すると同時に値を取得できますが、HasMember()はboolだけを返すことができます。 FindMember()を使用すると、最後に値が必要な場合はデータ構造を2回検索することができなくなります。 –

関連する問題