2017-10-07 34 views
0

私はコードがあります。rapidjasonでルートの配列を解析するには

Document d; 
const char* json = "[{\"k1\":\"1\"}, {\"k1\":\"2\"}]"; 
d.Parse(json); 
for (SizeType i = 0; i < d.Size(); i++) { 
    cout << d[i]["k1"].GetInt() << "\n"; 
} 

私はこれを実行すると、私はエラーの下に取得する:私は考え出し

rapidjson/include/rapidjson/document.h:1700: int rapidjson::GenericValue<Encoding, Allocator>::GetInt() const [with Encoding = rapidjson::UTF8<>; Allocator = rapidjson::MemoryPoolAllocator<>]: Assertion `data_.f.flags & kIntFlag' failed. 

一つの方法は、StringBufferのを受け入れライターを使用しています。配列要素のネストされた文字列を返します。

rapidjson::StringBuffer sb; 
rapidjson::Writer<rapidjson::StringBuffer> writer1(sb); 
d[0].Accept(writer1); 
std::cout << sb.GetString() << std::endl; 

上記の代替の出力は、次のとおりです。

{"k1":"1"} 

私は再び解析する上での文字列の出力をフィードバックすることができます。これを直接解析する方法はありますか?

PS:簡単なインターフェイスを備えたC++用のjasonパーサーはありますか?

+1

"1" - int型ではない - それは文字列なので 'd [i] [" k1 "]。GetString()'を使って取得する必要があります。 Intは引用符なしでjsonで表現されます。 jsonから "1"のような文字列を抽出した後、それをintに変換するためにstoiを使うことができます。 –

答えて

0

プログラマは、シリアル化またはデシリアライズするJSON文字列の形式を認識する必要があります。この場合、文字列の値を整数とみなしているようです。

これを修正するには、文字列として扱い、標準のC++ユーティリティを使用して文字列値を整数に変換するか、JSON文字列を更新して整数を含めることができます。 (intへの変換は、素敵な方法が可能で行われていないが)

最初のアプローチ:

Document d; 
const char* json = "[{\"k1\":1}, {\"k1\":2}]"; 
d.Parse(json); 
for (SizeType i = 0; i < d.Size(); i++) { 
    int d; 
    sscanf(d[i]["k1"].GetString(), "%d", &d); 
    cout << d << "\n"; 
} 

第二のアプローチ:

Document d; 
const char* json = "[{\"k1\":1}, {\"k1\":2}]"; 
d.Parse(json); 
for (SizeType i = 0; i < d.Size(); i++) { 
    cout << d[i]["k1"].GetInt() << "\n"; 
}