2017-11-07 2 views
1

Mein C++ - Programm erhält eine lange (Tausende von Symbolen) JSON-Zeichenfolge, die ich mit JSON Spirit (zum Debuggen) mit mehreren Zeilen, rechten Einrückung usw. drucken möchte. Zum Beispiel:Pretty-Drucken mit JSON Spirit

{ 
    "abc": "def", 
    "xyz": 
    [ 
    "pqr": "ijk" 
    ] 
} 

und so weiter. Ich versuchte, die write Funktion:

const json_spirit::Value val("...long JSON string here ..."); 
cout << json_spirit::write(val, json_spirit::pretty_print) << endl; 

bekam aber nur zusätzliche Schrägstriche in der ursprünglichen Zeichenfolge.

Können Sie bitte beraten, wie man das macht?

+0

In Zeile 230 in der Datei [writer_template.h] (https://sirikata.github.io/json-spirit/writer__template_8h_source.html) wird die Funktion 'add_escape_chars' aufgerufen, wenn ein String ausgegeben wird. Soweit ich sehen kann, gibt es keine Möglichkeit, dies zu verhindern, ohne den Code zu stören. – Darhuuk

+0

Siehe Zeile 56 von [writer_template.h] (https://sirikata.github.io/json-spirit/writer__template_8h_source.html), wobei '" 'explizit maskiert ist. – Darhuuk

Antwort

1

Der Grund, warum Sie Ihre ursprüngliche Eingabezeichenfolge zurückbekommen, liegt darin, dass Sie die Zeichenfolge direkt einer json_spirit::Value zuweisen. Was Sie stattdessen tun müssen, ist json_spirit10 die Zeichenfolge analysieren.

Der C++ 11-Code unten gibt die erwartete Ausgabe:

#include <json_spirit/json_spirit.h> 
#include <ostream> 
#include <string> 

int main() { 
    std::string const inputStr = 
    R"raw({ "abc": "def", "xyz": [ "pqr": "ijk" ] })raw"; 

    json_spirit::Value inputParsed; 
    json_spirit::read(inputStr, inputParsed); 

    std::cout 
    << json_spirit::write(inputParsed, json_spirit::pretty_print) << "\n"; 
} 

Randbemerkung: Es gibt eine ganze Reihe von leichter C++ JSON-Bibliotheken (dh nicht-Boost erforderlich), für den Fall, die Sie interessieren sollen Sie. Ich habe persönlich verwendet nlohmann's json, die nur eine einzige Header-Datei benötigt. RapidJSON scheint auch eine ausgezeichnete Option zu sein. Tonnen von Benchmarks für 40 + C++ JSON-Bibliotheken können auf der nativejson-benchmark Seite gefunden werden.

+0

@HEKTO Fertig, siehe komplett überarbeitete Antwort. – Darhuuk

+0

Danke ! Es funktioniert für mich. Ich werde meine Kommentare entfernen – HEKTO