Einführung in die Arbeit mit JSON in C++
JSON (JavaScript Object Notation) ist ein leichtes Datenaustauschformat, das häufig in der Webentwicklung, Konfigurationsdateien und APIs verwendet wird. Obwohl C++ keine integrierte Unterstützung für JSON bietet, gibt es viele zuverlässige Bibliotheken, die das Parsen und die Serialisierung von Daten vereinfachen. In diesem Artikel betrachten wir zwei beliebte Bibliotheken: nlohmann/json (empfohlen für Anfänger und moderne Projekte) und Boost.PropertyTree (für diejenigen, die bereits Boost verwenden). Sie erfahren, wie Sie JSON-Daten in C++ lesen, erstellen, ändern und ausgeben.
Bibliothek nlohmann/json: Installation und grundlegende Prinzipien
Die Bibliothek nlohmann/json (oft als "JSON for Modern C++" bezeichnet) ist aufgrund ihrer Einfachheit und intuitiven API eine der beliebtesten. Sie unterstützt C++11 und höher, benötigt keine externen Abhängigkeiten und wird als einzelne Header-Datei json.hpp verteilt.
Installation
Laden Sie die Datei json.hpp aus dem GitHub-Repository herunter und legen Sie sie in Ihrem Projektordner ab. Binden Sie sie dann im Code ein:
#include <iostream>#include <fstream>#include "json.hpp" // Einbinden der Bibliothek
using json = nlohmann::json;Parsen von JSON aus einem String und einer Datei
Die Bibliothek ermöglicht das Parsen von JSON aus einem String, einer Datei oder einem Eingabestream. Betrachten wir ein Beispiel für das Parsen aus einem String:
#include <iostream>#include "json.hpp"
using json = nlohmann::json;
int main() { // JSON-String std::string jsonString = R"({ "name": "Alice", "age": 30, "isStudent": false, "hobbies": ["reading", "coding"] })"; // Parsen json data = json::parse(jsonString); // Zugriff auf Daten std::cout << "Name: " << data["name"] << std::endl; std::cout << "Age: " << data["age"] << std::endl; std::cout << "Is student: " << (data["isStudent"] ? "true" : "false") << std::endl; // Iteration über das Array for (auto& hobby : data["hobbies"]) { std::cout << "Hobby: " << hobby << std::endl; } return 0;}Verwenden Sie zum Parsen aus einer Datei json::parse(std::ifstream("data.json"));.
Serialisierung von JSON
Das Erstellen eines JSON-Objekts und dessen Serialisierung in einen String erfolgt auf natürliche Weise:
#include <iostream>#include "json.hpp"
using json = nlohmann::json;
int main() { json person; person["name"] = "Bob"; person["age"] = 25; person["isStudent"] = true; person["hobbies"] = {"gaming", "swimming"}; // Verschachteltes Objekt json address; address["city"] = "Moscow"; address["street"] = "Tverskaya"; person["address"] = address; // Serialisierung in einen String mit Einrückung std::string serialized = person.dump(4); // 4 Leerzeichen für die Formatierung std::cout << serialized << std::endl; // Speichern in einer Datei std::ofstream file("output.json"); file << person.dump(2); file.close(); return 0;}Die Methode dump() wandelt das Objekt in einen String um. Der Parameter gibt die Anzahl der Leerzeichen für die Einrückung an (0 — kompakte Ausgabe).
Bibliothek Boost.PropertyTree: Ein alternativer Ansatz
Wenn in Ihrem Projekt bereits Boost verwendet wird, bietet die Bibliothek Boost.PropertyTree eine bequeme Möglichkeit, mit JSON und anderen Formaten (XML, INI) zu arbeiten. Sie ist weniger auf JSON spezialisiert, lässt sich aber gut in das Boost-Ökosystem integrieren.
Parsen von JSON mit Boost.PropertyTree
#include <iostream>#include <boost/property_tree/ptree.hpp>