2010-11-27 13 views
17

JSONCPP hat einen Schreiber, aber alles, was es zu tun scheint, ist, Informationen aus dem Parser zu bekommen und sie dann in eine Zeichenfolge oder einen Stream auszugeben. Wie kann ich neue Objekte, Arrays, Werte, Strings usw. ändern oder erstellen und in die Datei schreiben?JSONCPP Schreiben in Dateien

Antwort

9

AFAICT, Sie erstellen Objekte des Typs Json :: Value, der für alle JSON-Datentypen sorgt und das Ergebnis an einen Json :: Writer (einen seiner abgeleiteten Typen, um genau zu sein) oder einfach zu einem Strom.

Z. B .: ein Array von drei ganzen Zahlen in eine Datei schreiben:

Json::Value vec(Json::arrayValue); 
vec.append(Json::Value(1)); 
vec.append(Json::Value(2)); 
vec.append(Json::Value(3)); 
std::cout << vec; 
+0

Aber ich will es in die .json Datei schreiben. – Yelnats

+9

Verwenden Sie dann einen 'ofstream' anstelle von' cout'. –

+0

Yelnats, dann pipe es in eine Datei anstelle von std :: cout. – TimZaman

3

Zuerst müssen Sie die gewünschte JSON::Value erstellen. Sie sollten sich alle Konstruktoren ansehen (first). Informationen zum Erstellen der erforderlichen Hierarchien finden Sie unter append und den Operator [] overloads; Für beide Arrays gibt es Überladungen für die Objekte und string keys.

Eine Möglichkeit, den JSON-Wert zurück zu schreiben, ist die Verwendung von StyledStreamWriter::write und ofstream.

Siehe cegprakashs Antwort, wie man es schreibt.

+0

Ja, ich dachte darüber nach, nachdem ich Marcelos Antwort gelesen hatte. Es klappt. – Yelnats

+0

@Yelnats also, warum kennst du es nicht als eine angemessene Antwort? –

+1

'StyledStreamWriter' ist veraltet. Wenn Sie eine Anpassung benötigen, verwenden Sie ['StreamWriterBuilder'] (http://open-source-parsers.github.io/jsoncpp-docs/doxygen/class_json_1_1_stream_writer_builder.html). Oder folgen Sie einfach den anderen Antworten hier. – cdunn2001

35
#include<json/writer.h> 

Code:

Json::Value event; 
    Json::Value vec(Json::arrayValue); 
    vec.append(Json::Value(1)); 
    vec.append(Json::Value(2)); 
    vec.append(Json::Value(3)); 

    event["competitors"]["home"]["name"] = "Liverpool"; 
    event["competitors"]["away"]["code"] = 89223; 
    event["competitors"]["away"]["name"] = "Aston Villa"; 
    event["competitors"]["away"]["code"]=vec; 

    std::cout << event << std::endl; 

Ausgang:

{ 
     "competitors" : 
     { 
       "away" : 
       { 
         "code" : [ 1, 2, 3 ], 
         "name" : "Aston Villa" 
       }, 
       "home" : 
       { 
         "name" : "Liverpool" 
       } 
     } 
} 
+3

Das sieht wirklich gut aus. Was ist mit dem Hinzufügen von Klassen anstelle von int mit der .append-Methode? – malber

7
#include <json.h> 
#include <iostream> 
#include <fstream> 

void main() 
{ 
    std::ofstream file_id; 
    op_file_id.open("file.txt"); 

    Json::Value value_obj; 
    //populate 'value_obj' with the objects, arrays etc. 

    Json::StyledWriter styledWriter; 
    file_id << styledWriter.write(value_obj); 

    file_id.close(); 
} 
+0

Es ist einfacher zu verstehen, wenn Sie Ihre Antwort und nicht nur die Postleitzahl erklären. – SuperBiasedMan