Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Kaedah pemprosesan dan pelaksanaan JSON dalam C++

Kaedah pemprosesan dan pelaksanaan JSON dalam C++

王林
王林asal
2023-08-21 23:58:432494semak imbas

JSON ialah format pertukaran data ringan yang mudah dibaca dan ditulis serta mudah untuk dihuraikan dan dijana oleh mesin. Menggunakan format JSON memudahkan pemindahan data antara pelbagai sistem. Dalam C++, terdapat banyak perpustakaan JSON sumber terbuka untuk pemprosesan JSON. Artikel ini akan memperkenalkan beberapa kaedah pemprosesan dan pelaksanaan JSON yang biasa digunakan dalam C++.

Kaedah pemprosesan JSON dalam C++

  1. RapidJSON

RapidJSON ialah penghurai/penjana JSON C++ pantas yang menyediakan API gaya DOM, SAX dan kumpulan memori. Ciri-ciri utamanya adalah seperti berikut:

  • Jejak memori kecil dan kelajuan pelaksanaan yang pantas
  • Menyokong format pengekodan UTF-8, UTF-32 dan lain-lain
  • Menyokong pergerakan sematik C++11; pengurusan lebih cekap;
  • menyokong API gaya SAX, yang boleh menghuraikan fail JSON yang besar dengan cekap
  • menyokong strategi peruntukan tersuai (pembahagian).

Dalam RapidJSON, objek JSON boleh dihuraikan melalui DOM dan SAX, dan kaedah DOM boleh dilaksanakan melalui kelas Nilai. Berikut ialah kod sampel yang menggunakan RapidJSON untuk menjana dan menghuraikan 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 ialah perpustakaan pemprosesan harta yang ringkas dan mudah digunakan yang boleh mengendalikan pelbagai format hartanah. Antaranya, ia juga menyokong penghuraian dan penjanaan JSON. Boost.PropertyTree lebih perlahan daripada RapidJSON, tetapi ia juga mempunyai beberapa ciri:

  • menyokong berbilang format data, termasuk fail INI, XML dan JSON, dsb.
  • menyokong jenis data dalam pustaka standard C++ dan pustaka BOOST;
  • boleh pasang Dengan keupayaan pemprosesan format data yang tiada tandingan, pengguna boleh menulis format lanjutan mereka sendiri.
Berikut ialah contoh kod untuk menjana dan menghuraikan JSON menggunakan Boost.PropertyTree:

#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 ialah perpustakaan JSON C++ yang menyokong API kod kelakuan dan API gaya DOM. Antaranya, API DOM JsonCpp adalah serupa dengan kelas Nilai RapidJSON. Ciri-ciri JsonCpp adalah seperti berikut:

    menyokong pengekodan UTF-8;
  • menyokong penghuraian dan penjanaan JSON
  • menyediakan API terkapsul berorientasikan objek
  • menyokong sematik C++11;
Berikut ialah kod sampel untuk menjana dan menghuraikan JSON menggunakan 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 ialah perpustakaan pemprosesan JSON yang moden, ringan dan mudah digunakan. Ia menyediakan API berorientasikan objek dan menyokong piawaian C++11 dan ke atas. Ciri-ciri Nlohmann.Json adalah seperti berikut:

    Pelaksanaan pengepala fail tunggal, mudah digunakan
  • Menyokong berbilang bekas STL
  • Sangat ringan, pengepala sahaja
  • Keluaran berformat sangat mesra.
Berikut ialah kod sampel yang menggunakan Nlohmann.Json untuk menjana dan menghuraikan 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;
}

Pelaksanaan pemprosesan JSON dalam C++

Di atas memperkenalkan empat perpustakaan pemprosesan JSON yang biasa digunakan dalam C++. Mari kita lihat pelaksanaan khusus .

    Pelaksanaan RapidJSON
Mula-mula anda perlu memperkenalkan perpustakaan RapidJSON ke dalam projek, dan kemudian anda boleh menggunakan API DOM untuk menghuraikan dan menjana JSON. Kaedah DOM adalah untuk membaca keseluruhan objek JSON ke dalam memori dan menyimpannya dalam kelas Nilai.

Jana 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;

Parse 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();

    Boost.PropertyTree pelaksanaan
Menggunakan Boost.PropertyTree memerlukan pengenalan pustaka rangsangan ke dalam projek, dan kemudian anda boleh menjana kelas JSON. ptree ialah struktur pokok Selepas membaca JSON, nilai yang sepadan boleh diperolehi melalui fungsi get ptree.

Jana 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;

Parse 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");

    Pelaksanaan JsonCpp
Menggunakan JsonCpp memerlukan memperkenalkan perpustakaan JsonCpp ke dalam projek, dan kemudian anda boleh menggunakan kelas Nilai untuk menghuraikan dan menjana JSON. Kelas Nilai JsonCpp menyokong pelbagai jenis nilai, seperti rentetan, nombor, Boolean, dsb.

Jana JSON:

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

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

Parse 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();

    Nlohmann.Json implementation
Menggunakan Nlohmann.Json memerlukan pengenalan fail json.hpp ke dalam projek, dan kemudian anda boleh menggunakan objek JSON dan json . Nlohmann.Json menyediakan penukaran pelbagai jenis kontena STL.

Jana 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"];

Ringkasan

Artikel ini memperkenalkan empat perpustakaan pemprosesan JSON yang biasa digunakan dalam C++: RapidJSON, Boost.PropertyTree, JsonCpp dan Nloh serta beberapa ciri pelaksanaannya, JsonCpp dan Nloh. kaedah . Dengan menggunakan perpustakaan sumber terbuka ini, penghuraian dan penjanaan enkapsulasi JSON boleh dilakukan dengan mudah. Dalam penggunaan sebenar, pembangun harus memilih perpustakaan JSON yang paling sesuai dengan keperluan projek mereka untuk mendapatkan hasil yang terbaik.

Atas ialah kandungan terperinci Kaedah pemprosesan dan pelaksanaan JSON dalam C++. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn