Випуск Glaze 5.4: нові можливості бібліотеки для роботи з JSON
Випуск Glaze 5.4.0: високопродуктивна бібліотека для роботи з JSON отримала нові можливості
Відбувся випуск 5.4.0 високопродуктивної бібліотеки Glaze, призначеної для читання та запису JSON з зручними можливостями серіалізації та десеріалізації даних.
Також підтримуються формати CSV, BEVE та EETF (Erlang External Term Format) (опціонально, для компіляції потрібні бібліотеки Erlang). Бібліотека написана мовою C++ (header-only, стандарт C++23) і поширюється за ліцензією MIT.
Основні зміни у новому випуску Glaze
У новому випуску Glaze 5.4.0 з’явилися кілька важливих оновлень та покращень, що розширюють можливості бібліотеки для роботи з JSON:
- Нова сторінка документації, яка була покращена в цьому випуску.
- Додана можливість перейменування ключів під час компіляції.
- Додана підтримка glz::context для обробки помилок при роботі з glz::custom.
- Видалена compile-time опція use_hash_comparison.
- Видалено старий підхід з макросами та відвідуванням функцій-членів, що скоротило час компіляції.
- Додана підтримка буферів без завершальних нулів при читанні CSV.
- У функцію prettify_json додана перевірка максимальної межі глибини рекурсії (max_recursive_depth_limit = 256).
Перейменування ключів у високопродуктивній бібліотеці Glaze
Однією з найцікавіших нових функцій є можливість перейменування ключів під час компіляції:
struct renamed_t{
std::string first_name{};
std::string last_name{};
int age{};
};
template <>
struct glz::meta<renamed_t>{
static constexpr std::string_view rename_key(const std::string_view key) {
if (key == "first_name") {
return "firstName";
} else if (key == "last_name") {
return "lastName";
}
return key;
}
};
Також доступна більш потужна можливість використання std::string під час компіляції для динамічних перетворень ключів:
struct suffixed_keys_t{
std::string first{};
std::string last{};
};
template <>
struct glz::meta<suffixed_keys_t>{
static constexpr std::string rename_key(const auto key) {
return std::string(key) + "_name";
}
};
Розширена обробка помилок у високопродуктивній бібліотеці
Окрім того, в бібліотеці з’явилася підтримка glz::context для обробки помилок при роботі з glz::custom. Це дозволяє виконувати складну обробку помилок навіть з вимкненими винятками:
struct age_custom_error_obj{
int age{};
};
template <>
struct glz::meta<age_custom_error_obj>{
using T = age_custom_error_obj;
static constexpr auto read_x = [](T& s, int age, glz::context& ctx) {
if (age < 21) {
ctx.error = glz::error_code::constraint_violated;
ctx.custom_error_message = "age too young";
} else {
s.age = age;
}
};
static constexpr auto value = object("age", glz::custom<read_x, &T::age>);
};
При використанні цього коду:
age_custom_error_obj obj{};
std::string s = R"({"age":18})";
auto ec = glz::read_json(obj, s);
auto err_msg = glz::format_error(ec, s);
std::cout << err_msg << '\n';
Виводить повідомлення про помилку:
1:10: constraint_violated {"age":18}
^
age too young
Зауважте, що високопродуктивна бібліотека Glaze продовжує розвиватися, надаючи розробникам на C++ потужні інструменти для роботи з JSON та іншими форматами даних.
Більше інформації можна знайти на офіційній сторінці релізу на GitHub.




