Мы сегодня зафиксировали свежую версию 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, то дайте нам знать. Постараемся эту поддержку добавить. Ну а если это никому не интересно, то пусть все остается как есть.