webentwicklung-frage-antwort-db.com.de

Konvertieren eines Json :: Value in std :: string?

Ich verwende JsonCpp , um ein JSON-Objekt zu erstellen. Gibt es eine Möglichkeit, das Objekt als std::string zu erhalten, nachdem das Objekt erstellt wurde?

23
BRabbit27

Sie können einen Json :: Writer verwenden, um genau dies zu tun, da Sie davon ausgehen, dass Sie sie irgendwo speichern möchten, damit Sie keine für den Menschen lesbaren Ausgabe benötigen. Am besten verwenden Sie einen Json :: FastWriter und dann können Sie die write-Methode mit dem Parameter Ihres Json :: Value (dh Ihres Root-Verzeichnisses) aufrufen, und dann wird einfach ein std::string zurückgegeben:

Json::FastWriter fastWriter;
std::string output = fastWriter.write(root);
31
Jordan Doyle

Json::Writer ist veraltet und stattdessen sollte Json::StreamWriterBuilder verwendet werden, wie in der Dokumentation von Json::Writer angegeben.

Json::writeString schreibt in einen Stringstream und gibt dann einen String zurück:

Json::Value json = ...;
Json::StreamWriterBuilder builder;
builder["indentation"] = ""; // If you want whitespace-less output
const std::string output = Json::writeString(builder, json);

Ein dickes Lob an die Antwort von cdunn2001 hier: Wie erhalte ich JsonCPP-Werte als Zeichenketten?

8
martias

Wenn Ihr Json::value vom String-Typ ist, z. "bar" im folgenden json

{
    "foo": "bar"
}

Sie können Json::Value.asString verwenden, um den Wert von bar ohne zusätzliche Anführungszeichen zu erhalten (die hinzugefügt werden, wenn Sie StringWriterBuilder verwenden). Hier ist ein Beispiel:

Json::Value rootJsonValue;
rootJsonValue["foo"] = "bar";
std::string s = rootJsonValue["foo"].asString();
std::cout << s << std::endl; // bar
0
Searene

In meinem Kontext habe ich stattdessen ein einfaches . AsString () am Ende meines json-Wertobjekts verwendet. Wie @Searene sagte, werden die zusätzlichen Anführungszeichen entfernt, die Sie nicht benötigen, wenn Sie sie später verarbeiten möchten.

Json::Value credentials;
Json::Reader reader;

// Catch the error if wanted for the reader if wanted. 
reader.parse(request.body(), credentials);

std::string usager, password;
usager = credentials["usager"].asString();
password = credentials["password"].asString();

Wenn der Wert ein int anstelle eines Strings ist, funktioniert . AsInt () ebenfalls hervorragend.