Состоялся выпуск 5.4.0 высокопроизводительной библиотеки Glaze, предназначенной для чтения и записи JSON с удобными возможностями сериализации и десериализации данных.
Также поддерживаются форматы CSV, BEVE и EETF (Erlang External Term Format) (опционально, для компиляции требуются библиотеки Erlang).
Библиотека написана на языке C++ (header-only, стандарт C++23) и распространяется по лицензии MIT.
Список изменений:
- Новая страница документации, которая была улучшена в этом выпуске.
- Добавлена возможность переименования ключей во время компиляции:
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
. Это позволяет выполнять сложную обработку ошибок в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
- Удалена compile-time опция
use_hash_comparison
. Влияние этой опции уже давно уменьшилось из-за более нового подхода к хэшированию в Glaze. Удаление этой опции нарушает только тот код, который явно установил эту опцию вfalse
(по умолчанию былоtrue
). Удалите ссылки на этот код, и всё будет работать нормально. - Удалён старый, уродливый подход с макросами и посещением функций-членов, что сократило время компиляции.
- Добавлена поддержка буферов без завершающих нулей при чтении CSV.
- В функцию
prettify_json
добавлена проверка максимального предела глубины рекурсии (max_recursive_depth_limit = 256
).