Maison  >  Article  >  développement back-end  >  Méthodes de traitement JSON et implémentation en C++

Méthodes de traitement JSON et implémentation en C++

王林
王林original
2023-08-21 23:58:432494parcourir

JSON est un format d'échange de données léger, facile à lire et à écrire, et facile à analyser et à générer pour les machines. L'utilisation du format JSON facilite le transfert de données entre différents systèmes. En C++, il existe de nombreuses bibliothèques JSON open source pour le traitement JSON. Cet article présentera certaines méthodes de traitement JSON et implémentations couramment utilisées en C++.

Méthodes de traitement JSON en C++

  1. RapidJSON

RapidJSON est un analyseur/générateur C++ JSON rapide qui fournit des API de style DOM, SAX et pool de mémoire. Ses principales caractéristiques sont les suivantes :

  • Petite empreinte mémoire et vitesse d'exécution rapide
  • Prend en charge UTF-8, UTF-16, UTF-32 et d'autres formats d'encodage
  • Prend en charge la sématique de déplacement de C++11, créant ainsi de la mémoire ; une gestion plus efficace ;
  • prend en charge l'API de style SAX, qui peut analyser efficacement les gros fichiers JSON ;
  • prend en charge les stratégies d'allocation personnalisées (allocateur).

Dans RapidJSON, les objets JSON peuvent être analysés via DOM et SAX, et la méthode DOM peut être implémentée via la classe Value. Voici un exemple de code qui utilise RapidJSON pour générer et analyser JSON :

#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include <iostream>

using namespace rapidjson;
using namespace std;

int main() {
    // 生成JSON
    StringBuffer s;
    Writer<StringBuffer> writer(s);
    writer.StartObject();
    writer.Key("name");
    writer.String("Tom");
    writer.Key("age");
    writer.Int(20);
    writer.EndObject();

    // 解析JSON
    Document d;
    d.Parse(s.GetString());
    cout << "name: " << d["name"].GetString() << endl;
    cout << "age: " << d["age"].GetInt() << endl;

    return 0;
}
  1. Boost.PropertyTree

Boost.PropertyTree est une bibliothèque de traitement de propriétés simple et facile à utiliser qui peut gérer différents formats de propriétés. Parmi eux, il prend également en charge l'analyse et la génération de JSON. Boost.PropertyTree est légèrement plus lent que RapidJSON, mais il possède également certaines fonctionnalités :

  • prend en charge plusieurs formats de données, notamment les fichiers INI, XML et JSON, etc.
  • prend en charge les types de données dans la bibliothèque standard C++ et la bibliothèque BOOST ;
  • est enfichable Grâce à des capacités de traitement de format de données inégalées, les utilisateurs peuvent écrire leurs propres formats étendus.
Ce qui suit est un exemple de code permettant d'utiliser Boost.PropertyTree pour générer et analyser JSON :

#include <iostream>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>

using namespace std;
using boost::property_tree::ptree;
using boost::property_tree::read_json;
using boost::property_tree::write_json;

int main() {
    // 生成JSON
    ptree pt;
    pt.put("name", "Tom");
    pt.put("age", 20);

    // 解析JSON
    string json_str;
    write_json(cout, pt);
    cout << endl;

    read_json("test.json", pt);
    cout << "name: " << pt.get<string>("name") << endl;
    cout << "age: " << pt.get<int>("age") << endl;

    return 0;
}

    JsonCpp
JsonCpp est une bibliothèque C++ JSON qui prend en charge l'API de code de conduite et l'API de style DOM. Parmi eux, l'API DOM de JsonCpp est similaire à la classe Value de RapidJSON. Les fonctionnalités de JsonCpp sont les suivantes :

    prend en charge l'encodage UTF-8 ;
  • prend en charge l'analyse et la génération JSON ;
  • fournit une API encapsulée orientée objet ;
  • prend en charge la sématique de déplacement C++11 ;
Ce qui suit est un exemple de code pour générer et analyser JSON à l'aide de JsonCpp :

#include <iostream>
#include <json/json.h>

using namespace std;
using namespace Json;

int main() {
    // 生成JSON
    Value root;
    root["name"] = "Tom";
    root["age"] = 20;
    string json_str = root.toStyledString();
    cout << json_str << endl;

    // 解析JSON
    Reader reader;
    Value value;
    reader.parse("{"name":"Tom","age":20}", value, false);
    cout << "name: " << value["name"].asString() << endl;
    cout << "age: " << value["age"].asInt() << endl;

    return 0;
}

    Nlohmann.Json
Nlohmann.Json est une bibliothèque de traitement JSON moderne, légère et facile à utiliser. Il fournit une API orientée objet et prend en charge les normes C++11 et supérieures. Les fonctionnalités de Nlohmann.Json sont les suivantes :

    Implémentation d'un en-tête de fichier unique, facile à utiliser ;
  • Prend en charge plusieurs conteneurs STL ;
  • Très léger, en-têtes uniquement ;
  • La sortie formatée est très conviviale ;
Ce qui suit est un exemple de code qui utilise Nlohmann.Json pour générer et analyser JSON :

#include <iostream>
#include <nlohmann/json.hpp>

using namespace std;
using json = nlohmann::json;

int main() {
    // 生成JSON
    json j;
    j["name"] = "Tom";
    j["age"] = 20;
    string json_str = j.dump();
    cout << json_str << endl;

    // 解析JSON
    json j2 = json::parse("{"name":"Tom","age":20}");
    cout << "name: " << j2["name"] << endl;
    cout << "age: " << j2["age"] << endl;

    return 0;
}

Implémentation du traitement JSON en C++

Ce qui précède présente quatre bibliothèques de traitement JSON couramment utilisées en C++. .

    Implémentation RapidJSON
Vous devez d'abord introduire la bibliothèque RapidJSON dans le projet, puis vous pouvez utiliser l'API DOM pour analyser et générer JSON. La méthode DOM consiste à lire l'intégralité de l'objet JSON en mémoire et à le stocker dans une classe Value.

Générer JSON :

// 生成JSON
Value root(kObjectType);
Value person(kObjectType);
person.AddMember("name", "Tom", allocator);
person.AddMember("age", 20, allocator);
root.AddMember("person", person, allocator);

StringBuffer buffer;
Writer<StringBuffer> writer(buffer);
root.Accept(writer);
cout << buffer.GetString() << endl;

Analyser JSON :

// 解析JSON
Document d;
d.Parse("{"person":{"name":"Tom","age":20}}");
const Value& person = d["person"];
const string name = person["name"].GetString();
const int age = person["age"].GetInt();

    Implémentation de Boost.PropertyTree
L'utilisation de Boost.PropertyTree nécessite l'introduction de la bibliothèque boost dans le projet, puis vous pouvez utiliser la classe ptree pour analyser et générer JSON. ptree est une structure arborescente. Après avoir lu JSON, la valeur correspondante peut être obtenue via la fonction get de ptree.

Générer JSON :

// 生成JSON
ptree root;
ptree person;
person.put("name", "Tom");
person.put("age", 20);
root.add_child("person", person);

stringstream stream;
write_json(stream, root);
cout << stream.str() << endl;

Analyser JSON :

// 解析JSON
ptree root;
read_json("test.json", root);
const string name = root.get<string>("person.name");
const int age = root.get<int>("person.age");

    Implémentation JsonCpp
L'utilisation de JsonCpp nécessite l'introduction de la bibliothèque JsonCpp dans le projet, puis vous pouvez utiliser la classe Value pour analyser et générer JSON. La classe Value de JsonCpp prend en charge plusieurs types de valeurs, tels que des chaînes, des nombres, des valeurs booléennes, etc.

Générer JSON :

// 生成JSON
Value root;
Value person;
person["name"] = "Tom";
person["age"] = 20;
root["person"] = person;

cout << root.toStyledString() << endl;

Analyser JSON :

// 解析JSON
Reader reader;
Value value;
string json_str = "{"person":{"name":"Tom","age":20}}";
reader.parse(json_str, value);
const string name = value["person"]["name"].asString();
const int age = value["person"]["age"].asInt();

    Implémentation de Nlohmann.Json
L'utilisation de Nlohmann.Json nécessite l'introduction du fichier json.hpp dans le projet, puis vous pouvez utiliser l'objet json pour analyser et générer JSON . Nlohmann.Json permet la conversion de différents types de conteneurs STL.

Générer JSON :

// 生成JSON
json j;
j["person"]["name"] = "Tom";
j["person"]["age"] = 20;

cout << j.dump() << endl;

Parse JSON :

// 解析JSON
json j2 = json::parse("{"person":{"name":"Tom","age":20}}");
const string name = j2["person"]["name"];
const int age = j2["person"]["age"];

Résumé

Cet article présente quatre bibliothèques de traitement JSON couramment utilisées en C++ : RapidJSON, Boost.PropertyTree, JsonCpp et Nlohmann.Json, ainsi que certaines de leurs caractéristiques et de leur implémentation. méthodes. En utilisant ces bibliothèques open source, l'analyse et la génération de l'encapsulation JSON peuvent être facilement effectuées. En utilisation réelle, les développeurs doivent choisir la bibliothèque JSON qui correspond le mieux aux besoins de leur projet pour obtenir les meilleurs résultats.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn