Introduction au travail avec JSON en C++
JSON (JavaScript Object Notation) est un format léger d'échange de données largement utilisé dans le développement web, les fichiers de configuration et les API. Bien que C++ ne dispose pas de support natif pour JSON, il existe de nombreuses bibliothèques fiables qui simplifient l'analyse (parsing) et la sérialisation (conversion en chaîne) des données. Dans cet article, nous examinerons deux bibliothèques populaires : nlohmann/json (recommandée pour les débutants et les projets modernes) et Boost.PropertyTree (pour ceux qui utilisent déjà Boost). Vous apprendrez à lire, créer, modifier et afficher des données JSON en C++.
Bibliothèque nlohmann/json : installation et principes de base
La bibliothèque nlohmann/json (souvent appelée "JSON for Modern C++") est l'une des plus populaires grâce à sa simplicité et son API intuitive. Elle prend en charge C++11 et versions ultérieures, ne nécessite aucune dépendance externe et est distribuée sous forme d'un seul fichier d'en-tête json.hpp.
Installation
Téléchargez le fichier json.hpp depuis le dépôt GitHub et placez-le dans le dossier de votre projet. Ensuite, incluez-le dans votre code :
#include <iostream>#include <fstream>#include "json.hpp" // Inclusion de la bibliothèque
using json = nlohmann::json;Analyse de JSON à partir d'une chaîne et d'un fichier
La bibliothèque permet d'analyser JSON à partir d'une chaîne, d'un fichier ou d'un flux d'entrée. Voici un exemple d'analyse à partir d'une chaîne :
#include <iostream>#include "json.hpp"
using json = nlohmann::json;
int main() { // Chaîne JSON std::string jsonString = R"({ "name": "Alice", "age": 30, "isStudent": false, "hobbies": ["reading", "coding"] })"; // Analyse json data = json::parse(jsonString); // Accès aux données std::cout << "Name: " << data["name"] << std::endl; std::cout << "Age: " << data["age"] << std::endl; std::cout << "Is student: " << (data["isStudent"] ? "true" : "false") << std::endl; // Itération sur le tableau for (auto& hobby : data["hobbies"]) { std::cout << "Hobby: " << hobby << std::endl; } return 0;}Pour analyser à partir d'un fichier, utilisez json::parse(std::ifstream("data.json"));.
Sérialisation JSON
La création d'un objet JSON et sa sérialisation en chaîne se fait de manière naturelle :
#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"}; // Objet imbriqué json address; address["city"] = "Moscow"; address["street"] = "Tverskaya"; person["address"] = address; // Sérialisation en chaîne avec indentation std::string serialized = person.dump(4); // 4 espaces pour le formatage std::cout << serialized << std::endl; // Sauvegarde dans un fichier std::ofstream file("output.json"); file << person.dump(2); file.close(); return 0;}La méthode dump() convertit l'objet en chaîne. Le paramètre indique le nombre d'espaces pour l'indentation (0 pour une sortie compacte).
Bibliothèque Boost.PropertyTree : une approche alternative
Si votre projet utilise déjà Boost, la bibliothèque Boost.PropertyTree offre un moyen pratique de travailler avec JSON et d'autres formats (XML, INI). Elle est moins spécialisée pour JSON, mais s'intègre bien avec l'écosystème Boost.
Analyse JSON avec Boost.PropertyTree
#include <iostream>#include <boost/property_tree/ptree.hpp>