serialization (tsz. serializations)
Ebben a leírásban JSON-alapú szerializációval foglalkozunk, és a nlohmann::json C++ könyvtár segítségével valósítjuk meg, amely egy modern, könnyen használható, header-only JSON parser és serializer.
Ez a könyvtár egyetlen json.hpp
fájlból áll:
include/
mappájába, vagy oda, ahonnan az #include
megtalálja.
nlohmann::json
típus#include <nlohmann/json.hpp>
using json = nlohmann::json;
A json
típus egy union-szerű wrapper, amely lehet:
json j;
j = "Alice";
j = 30;
j = false;
std::cout << j.dump(4); // pretty-print
Tegyük fel, hogy van egy struct
:
struct Person {
std::string name;
int age;
bool student;
};
Szerializáláshoz két függvényt definiálunk: to_json
– JSON-t készít egy objektumból from_json
– objektumot hoz létre JSON-ból
void to_json(json& j, const Person& p) {
j = json{{"name", p.name}, {"age", p.age}, {"student", p.student}};
}
void from_json(const json& j, Person& p) {
j.at("name").get_to(p.name);
j.at("age").get_to(p.age);
j.at("student").get_to(p.student);
}
Person p{"Bob", 22, true};
json j = p;
std::cout << j.dump(); // {"name":"Bob","age":22,"student":true}
Person p2 = j.get<Person>();
#include <fstream>
// Írás
std::ofstream out("person.json");
out << j.dump(4); // szépen formázva
out.close();
// Olvasás
std::ifstream in("person.json");
json j2;
in >> j2;
Person p3 = j2.get<Person>();
std::vector<Person> people = {
{"Alice", 25, false},
{"Bob", 22, true}
};
json j = people; // automatikusan sorozattá alakul
std::ofstream("people.json") << j.dump(2);
// Deszerializálás
std::ifstream f("people.json");
json j2;
f >> j2;
std::vector<Person> others = j2.get<std::vector<Person>>();
struct Product {
std::string id;
int price;
json toJson() const {
return json{{"id", id}, {"price", price}};
}
static Product fromJson(const json& j) {
return Product{j.at("id"), j.at("price")};
}
};
try {
json j = json::parse("{bad json}");
} catch (const json::parse_error& e) {
std::cerr << "Hiba: " << e.what() << "\n";
}
Hiba | Ok |
---|---|
type must be string but is null
|
JSON-ben a kulcs vagy érték null , nem string
|
key not found
|
at("kulcs") nem található; használj contains()
|
type_error.302
|
Rossz típusú értéket próbálsz kiolvasni |
Művelet | Kód példa |
---|---|
Szerializálás | json j = objektum;
|
Deszerializálás | Objektum o = j.get<Objektum>();
|
Írás fájlba | ofstream f("f.json"); f << j.dump();
|
Olvasás fájlból | ifstream f("f.json"); f >> j;
|
Egyedi konverzió | to_json , from_json függvények
|
Íme egy teljes példa arra, hogyan lehet egy JSON tömböt kiírni fájlba a nlohmann::json
könyvtárral, egy általánosabb témában – például diákok vizsgapontszámai:
vizsgaEredmenyekKiiras()
#include <iostream>
#include <fstream>
#include <nlohmann/json.hpp>
using json = nlohmann::json;
using namespace std;
void vizsgaEredmenyekKiiras() {
// 1. JSON tömb inicializálása
json eredmenyek = json::array();
// 2. Feltöltés példákkal
vector<string> diakok = {"Anna", "Béla", "Csaba", "Dóra"};
vector<int> pontszamok = {92, 78, 85, 66};
for (size_t i = 0; i < diakok.size(); ++i) {
json egyEredmeny = {
{"nev", diakok},
{"pontszam", pontszamok},
{"sikeres", pontszamok >= 60}
};
eredmenyek.push_back(egyEredmeny);
}
// 3. Fájlba írás (pretty print)
ofstream out("vizsgaeredmenyek.json");
if (!out) {
cerr << "Nem sikerült megnyitni az output fájlt!" << endl;
return;
}
out << eredmenyek.dump(4); // 4 szintű indentálás
out.close();
cout << "Kiírás kész: vizsgaeredmenyek.json" << endl;
}
vizsgaeredmenyek.json
fájl tartalma:[
{
"nev": "Anna",
"pontszam": 92,
"sikeres": true
},
{
"nev": "Béla",
"pontszam": 78,
"sikeres": true
},
{
"nev": "Csaba",
"pontszam": 85,
"sikeres": true
},
{
"nev": "Dóra",
"pontszam": 66,
"sikeres": true
}
]