Випуск 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.