пятница, 10 августа 2018 г.

[prog.c++] json_dto-0.2.6: небольшое, но довольно важное обновление

Мы сегодня зафиксировали свежую версию 0.2.6 своей легковесной библиотеки json_dto. Там одна новая фича, но, думается, достаточно важная для определенных сценариев работы с JSON-документами.

Дело в том, что мы json_dto делали для себя, для ситуаций, когда JSON-документ хранил внутри единственный сериализованный объект. Т.е. мы имели дело с JSON-документами вида: {"field":...}. А вот на днях один из пользователей json_dto обратил наше внимание на ситуацию, когда JSON-документ представляет из себя вектор из объектов. Т.е. что-то вроде: [{"field":...}, {"field":...}, {"field":...}]. В такой ситуации json_dto оказывался бесполезным.

Этот же пользователь поделился своими соображениями о том, как он бы хотел использовать json_dto в такой ситуации. Он бы хотел иметь возможность написать json_dto::from_json<std::vector<Data>>(json_document) и чтобы результатом был экземпляр std::vector с объектами типа Data внутри.

Собственно, именно это мы и добавили в версию 0.2.6. Теперь можно писать вот так:

#include <json_dto/pub.hpp>

#include <iostream>
#include <algorithm>

struct data_t {
   std::string m_key;
   int m_value;

   template<typename Json_Io>
   void json_io(Json_Io & io) {
      io & json_dto::mandatory("key", m_key)
         & json_dto::mandatory("value", m_value);
   }
};

int main() {
   const std::string json_data{
      R"JSON(
         [{"key":"first", "value":32},
          {"key":"second", "value":15},
          {"key":"third", "value":80}]
      )JSON"
   };

   auto data = json_dto::from_json< std::vector<data_t> >(json_data);
   std::sort(data.begin(), data.end(),
      [](const auto & a, const auto & b) { return a.m_value < b.m_value; });

   std::cout << "Sorted data: " << json_dto::to_json(data) << std::endl;
}

И получать при этом вполне ожидаемый результат:

Sorted data: [{"key":"second","value":15},{"key":"first","value":32},{"key":"third","value":80}]

В общем, кто хочет легко и удобно работать с JSON-ом, то не стесняемся, берем json_dto, пользуемся, делимся впечатлениями. Взять json_dto можно на BitBucket-е или на GitHub-e (со временем версия 0.2.6 подтянется и на vcpkg).

Кстати говоря, с теми, кому json_dto интересен, можно было бы обсудить вот еще что: в принципе, в описанном выше сценарии вовсе необязательно работать только с std::vector<Data>. Запросто может быть использован и std::deque<Data>, std::list<Data> или даже std::array<Data, N>. Если кому-то хотелось бы видеть в json_dto поддержку и других STL-левских контейнеров, а не только std::vector, то дайте нам знать. Постараемся эту поддержку добавить. Ну а если это никому не интересно, то пусть все остается как есть.