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-example

Hier 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++