Ich versuche in einer JSON-Datei zu lesen. Bisher habe ich mich auf die Verwendung von jsoncpp konzentriert. Ich bin jedoch sehr neu in C ++ und die Dokumentation ist für mich ziemlich schwer zu verstehen. Könnte jemand vielleicht laienhaft erklären, was es tut?
Sagen Sie, ich habe eine people.json, die so aussieht:
%Vor% Was passiert, wenn ich das hier lese? Kann ich eine Art Datenstruktur people
erstellen, die ich nach Anna
und Ben
sowie age
und profession
indexieren kann? Was wäre der Datentyp von people
? Ich dachte, es wäre etwas Ähnliches wie eine (verschachtelte) Map, aber Map-Werte müssen immer den gleichen Typ haben, nicht wahr?
Ich habe vorher mit Python gearbeitet und mein "Ziel" (das für C ++ nicht korrekt gesetzt ist) besteht darin, das Äquivalent eines verschachtelten Python-Wörterbuchs zu erhalten.
Ja, Sie können eine verschachtelte Datenstruktur people
erstellen, die durch Anna
und Ben
indiziert werden kann. Sie können es jedoch nicht direkt von age
und profession
indizieren (ich werde zu diesem Teil im Code gelangen).
Der Datentyp von people
hat den Typ Json::Value
(der in jsoncpp definiert ist). Sie haben Recht, es ist ähnlich der verschachtelten Karte, aber Value
ist eine Datenstruktur, die so definiert ist, dass mehrere Typen gespeichert und zugegriffen werden kann. Es ähnelt einer Karte mit string
als Schlüssel und Json::Value
als Wert. Es könnte auch eine Karte zwischen einem unsigned int
als Schlüssel und Json::Value
als Wert sein (im Falle von JSON-Arrays).
Hier ist der Code:
%Vor%Wie Sie sehen, können Sie das json-Objekt nur basierend auf der Hierarchie der Eingabedaten indizieren.
Grundsätzlich arbeiten Javascript und C ++ nach zwei verschiedenen Prinzipien. Javascript erstellt eine "assoziative Matrix" oder eine Hash-Tabelle, die einen String-Schlüssel, der den Feldnamen darstellt, mit einem Wert vergleicht. C ++ legt Strukturen im Speicher fest, also sind die ersten 4 Bytes eine Ganzzahl, die ein Alter ist, dann haben wir vielleicht eine feste 32 Byte lange Zeichenfolge, die den "Beruf" darstellt.
So wird JavaScript mit Dingen wie "Alter" umgehen, die 18 in einer Aufzeichnung und "neunzehn" in einer anderen sind. C ++ kann nicht. (Allerdings ist C ++ viel schneller).
Wenn wir also mit JSON in C ++ umgehen wollen, müssen wir das assoziative Array von Grund auf aufbauen. Dann müssen wir die Werte mit ihren Typen kennzeichnen. Ist es eine ganze Zahl, ein reeller Wert (wahrscheinlich als "double"), boolean, eine Zeichenkette? Daraus folgt, dass eine JSON C ++ - Klasse ziemlich viel Code enthält. Effektiv implementieren wir ein bisschen Javascript in C ++. Wir geben dann unserem JSON-Parser den JSON als String, und er markiert ihn und gibt uns Funktionen, um den JSON von C ++ abzufragen.
Leute wie diese speichern
%Vor%wird Probleme verursachen, besonders wenn verschiedene Völker denselben Namen haben.
Verwenden Sie stattdessen Array, das Objekte wie dieses speichert
%Vor%so können Sie Objekte aufzählen oder Objekte mit numerischem Index aufrufen. Denken Sie daran, dass JSON Storage-Struktur, nicht dynamisch Sortierer oder Indexer ist. Verwenden Sie in json gespeicherte Daten, um Indizes nach Bedarf zu erstellen und auf Daten zuzugreifen.
Beispiel (mit vollständigem Quellcode) zum Lesen einer json Konfigurationsdatei:
%Vor%Tags und Links c++ json dictionary jsoncpp