RapidJSON beheben: Assertion `!hasRoot_' failed.
English
Deutsch
Problem:
Ihr Programm verwendet RapidJSON, aber beim Ausführen sehen Sie eine Fehlermeldung wie
rapidjson_assertion.txt
rapidjson-example: /usr/include/rapidjson/writer.h:452: void rapidjson::Writer<OutputStream, SourceEncoding, TargetEncoding, StackAllocator, writeFlags>::Prefix(rapidjson::Type) [with OutputStream = rapidjson::BasicOStreamWrapper<std::basic_ostream<char> >; SourceEncoding = rapidjson::UTF8<>; TargetEncoding = rapidjson::UTF8<>; StackAllocator = rapidjson::CrtAllocator; unsigned int writeFlags = 0]: Assertion `!hasRoot_' failed.Lösung
Sie verwenden einen Writer für mehr als ein Document. Während Sie den Stream, der dem Writer zugrunde liegt, für beliebig viele Dokumente verwenden können, muss jeder Writer nur einmal verwendet werden!
Um das Problem zu beheben, erstellen Sie eine Writer-Instanz (auf demselben Ausgabe-Stream) für jedes Dokument, das Sie schreiben möchten.
Minimaler Code zur Reproduktion des Problems:
rapidjson_hasroot_repro.cpp
#include <iostream>
#include <rapidjson/document.h>
#include <rapidjson/writer.h>
#include <rapidjson/ostreamwrapper.h>
using namespace rapidjson;
using namespace std;
Document generateDoc() {
// Dokument generieren: {"text": "Hello JSON!"}
Document doc;
doc.SetObject(); // doc zu einem Objekt machen!
doc.AddMember("text", "Hello JSON!", doc.GetAllocator());
return doc;
}
int main() {
// Auf stdout schreiben
OStreamWrapper out(cout);
Writer<OStreamWrapper> writer(out);
// Erstes Dokument schreiben...
generateDoc().Accept(writer);
cout << "\nErstes Dokument geschrieben!" << endl;
// Zweites Dokument schreiben...
generateDoc().Accept(writer);
cout << "\nZweites Dokument geschrieben!" << endl;
}Dieser Code stürzt mit der oben aufgeführten Fehlermeldung ab:
rapidjson_hasroot_crash_output.txt
{"text":"Hello JSON!"}
First document written!
rapidjson-example: /usr/include/rapidjson/writer.h:452: void rapidjson::Writer<OutputStream, SourceEncoding, TargetEncoding, StackAllocator, writeFlags>::Prefix(rapidjson::Type) [with OutputStream = rapidjson::BasicOStreamWrapper<std::basic_ostream<char> >; SourceEncoding = rapidjson::UTF8<>; TargetEncoding = rapidjson::UTF8<>; StackAllocator = rapidjson::CrtAllocator; unsigned int writeFlags = 0]: Assertion `!hasRoot_' failed.
zsh: abort (core dumped) ./rapidjson-exampleHier ist der korrigierte Code, der wie beabsichtigt funktioniert:
rapidjson_hasroot_fixed.cpp
#include <iostream>
#include <rapidjson/document.h>
#include <rapidjson/writer.h>
#include <rapidjson/ostreamwrapper.h>
using namespace rapidjson;
using namespace std;
Document generateDoc() {
// Dokument generieren: {"text": "Hello JSON!"}
Document doc;
doc.SetObject(); // doc zu einem Objekt machen!
doc.AddMember("text", "Hello JSON!", doc.GetAllocator());
return doc;
}
int main() {
// Auf stdout schreiben
OStreamWrapper out(cout);
// Erstes Dokument schreiben...
Writer<OStreamWrapper> writer1(out);
generateDoc().Accept(writer1);
cout << "\nErstes Dokument geschrieben!" << endl;
// Zweites Dokument schreiben...
Writer<OStreamWrapper> writer2(out); // Derselbe Ausgabestream wie writer1!
generateDoc().Accept(writer2);
cout << "\nZweites Dokument geschrieben!" << endl;
}Ausgabe:
rapidjson_hasroot_fixed_output.txt
{"text":"Hello JSON!"}
Erstes Dokument geschrieben!
{"text":"Hello JSON!"}
Zweites Dokument geschrieben!Check out similar posts by category:
C/C++
If this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow