2016-05-26 34 views
3

これは私のJson配列です。rapidjsonを使って入れ子になったJsonを読む

{ 
    "colorsArray":[{ 
      "colorName":"red", 
      "hexValue":"#f00" 
     }, 
     { 
      "colorName":"green", 
      "hexValue":"#0f0" 
     }, 
     { 
      "colorName":"blue", 
      "hexValue":"#00f" 
     } 
    ] 
} 

「緑色」の値を取得したい。 rapidjsonライブラリのC++コードは

Document document; 
document.Parse<0>(jsoncontent.c_str()).HasParseError(); 
document.Parse(jsoncontent.c_str()); 
const Value& user = document["colorsArray"]; 
string name = user["colorName"].GetString(); 

です。私がcolorNameにアクセスしようとすると、以下のランタイムエラーが発生します。

rapidjson::GenericValue<Encoding, Allocator>::MemberIterator 
rapidjson::GenericValue<Encoding, Allocator>::FindMember(const 
rapidjson::GenericValue<Encoding, SourceAllocator>&) [with SourceAllocator 
= rapidjson::MemoryPoolAllocator<>; Encoding = rapidjson::UTF8<>; 
Allocator = rapidjson::MemoryPoolAllocator<>; 
rapidjson::GenericValue<Encoding, Allocator>::MemberIterator = 
rapidjson::GenericMemberIterator<false, rapidjson::UTF8<>, 
rapidjson::MemoryPoolAllocator<> >]: Assertion `IsObject()' failed. 

    Aborted (core dumped) 

Rapidjsonライブラリを使用して特定の値を読み取るにはどうすればよいですか?

+1

には、最初に第二の要素を取得する必要があります。 auto&second_element = user [1]; 文字列名= second_element.GetString(); また、user.size()メソッドを使用して繰り返しを使用することもできます。 – Jonathan

答えて

-1

簡単には、私の意見では、この文書は不完全です。 読み取り値コードをループ本体またはスレッドに入れてプログラムを実行すると、終了時にエラーが発生します。だから、あなたが値を取得したいときにまず文書がIsObject()であると判断してください。

多分これは、仕事することができます:それが配列である

Document document; 
document.Parse<0>(jsoncontent.c_str()).HasParseError(); 
document.Parse(jsoncontent.c_str()); 
if(document.IsObject())  // add this line 
{ 
    const Value& user = document["colorsArray"]; 
    string name = user["colorName"].GetString(); 
} 
関連する問題