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