2017-05-12 10 views
1

私は、JSON文字列を生成するには、次のC++のコードをしている:しかし、私は、以前のJSONデータを出力した後、別のJSONオブジェクトを作成したいC++ RapidJSONクリア書かれた文字列

StringBuffer JSONData; 
PrettyWriter<StringBuffer> writer(JSONData); 
writer.StartObject(); 
writer.String("hello"); 
writer.String("world"); 
writer.String("t"); 
writer.Bool(true); 
writer.String("f"); 
writer.Bool(false); 
writer.String("n"); 
writer.Null(); 
writer.String("i"); 
writer.Uint(123); 
writer.String("pi"); 
writer.Double(3.1416); 
writer.EndObject(); 

cout << JSONData.GetString() << endl; 
//OUTPUTS: 
{ 
    "hello": "world", 
    "t": true, 
    "f": false, 
    "n": null, 
    "i": 123, 
    "pi": 3.1416, 
} 


JSONData.Clear(); 
writer.Reset(JSONData); //Wont compile 
writer.StartObject(); //FAILS !Base::hasRoot_ 
writer.String("hello"); 
writer.String("world"); 
writer.String("t"); 
writer.Bool(true); 
writer.EndObject(); 
cout << JSONData.GetString() << endl; 

。これは私にエラーAssertion failed: !Base::hasRoot_を返します。これをどうすれば解決できますか?

答えて

1

This linkは、PrettyWriterのRapidJSONヘッダーです。 247行目で遭遇したエラーを見つけることができます。私はrapidJSONプロではありませんが、あなたがそれをクリアしたとしても、ライターは1つのオブジェクトに対してのみ動作すると思います。私はこれが完全な答えではないことを知っていますが、とにかくヒントになると思っていました。

また、thisリンクを使用すると、PrettyWriterの使用方法に関するヒントを得ることができます。

reset()RapidJSON documentationが役に立ちます。

この関数は、複数のJSONを出力するためにWriterオブジェクトを再利用できるようにするために、新しいストリームとデフォルト設定でライターをリセットします。ただ、

StringBuffer JSONData; 
PrettyWriter<StringBuffer> writer(JSONData); 
writer.StartObject(); 
// ... 
writer.EndObject(); 

JSONData.Clear(); 
writer.Reset(JSONData); 
writer.StartObject(); 
// ... 
writer.EndObject(); 

あなたも、別の出力ストリームを作成して、リセットし、それを解析することができます:

Writer<OutputStream> writer(os1); 
writer.StartObject(); 
// ... 
writer.EndObject(); 
writer.Reset(os2); 
writer.StartObject(); 
// ... 
writer.EndObject(); 

あなたはこのような何かを試みることができる:

この非常にドキュメントは、次の例を提供します

+0

はい、リセットすることはできません...何でもコンパイルできません。 –

+0

@TVAvanHeste私は答えを編集しました – Badda

+0

信じられないほど、これはうまくいきました...私はすでにこのオプションを試したと思っていましたが、タイプミスなどがあったに違いないと思います。どうもありがとう –

関連する問題