LINUX.ORG.RU

Glaze 5.4.0

 , , , ,

Glaze 5.4.0

1

4

Состоялся выпуск 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).

>>> Подробности на GitHub

★★★★★

Проверено: CrX ()
Последнее исправление: CrX (всего исправлений: 1)

Новость хорошая, но я, как неофит в крестах, сабжем не пользуюсь.

Маленький ишшо. 😉😁

sparkie ★★★★★
()

По ссылке на тесты производительности в качестве единиц указаны какие-то непонятные (MB/s).

Разве производительность перекладывания джисонов не в сотнях ккк/нсек измеряют?

apt_install_lrzsz ★★★
()
Ответ на: комментарий от apt_install_lrzsz

какие-то непонятные (MB/s).

У большинства библиотек будут же несолидные результаты < 1, если измерять в GB/s.

https://github.com/simdjson/simdjson?tab=readme-ov-file#performance-results

The simdjson library uses three-quarters less instructions than state-of-the-art parser RapidJSON. To our knowledge, simdjson is the first fully-validating JSON parser to run at gigabytes per second (GB/s) on commodity processors. It can parse millions of JSON documents per second on a single core.

dataman ★★★★★
() автор топика

Когда нашей команде потребовалась плюсовая либа для разбора json, нужен был непременно также валидатор схемы, без него никуда.

seiken ★★★★★
()
Ответ на: комментарий от dataman

Ох, давно это было, сейчас уже не вспомню. Помню, что были какие-то проблемы с отдельными случаями, то ли нулями, то ли с плавучкой… В общем, всё там рассчитано на то, что «это для js, и js знает, как надо», а в итоге каждый плюсовый валидатор по-своему трактует спеку. В общем, говно этот Джейсон, когда речь заходит о конкретной спецификации типа (сколько бит, знаковое, без знаковое). В идеале было бы неплохо не просто иметь тип «целые», а что-то типа сишного uint16_t и ко.

seiken ★★★★★
()
Последнее исправление: seiken (всего исправлений: 1)
Ответ на: комментарий от dataman

Да, там у нас в наличии было только C++14.

seiken ★★★★★
()
Ответ на: комментарий от doomer

QJson

Мало того что не умеет ничего, так еще и самый тормозной

technic93
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.