ajson
Требования: компилятор C++11.
Утилита для сериализации C++ и JSON.
Мотивация:
В работе часто возникает потребность получить текст в формате JSON, разобрать его в DOM-объект (например, с помощью rapidjson) и прочитать значения узлов. Затем полученный DOM становится ненужным, и его создание и разбор кажутся избыточными. Также бывает необходимо выполнить обратную операцию: сериализовать структуру данных C++ в DOM, а затем снова сериализовать DOM в текст. В этом случае также возникает ощущение избыточности DOM.
Поэтому возникла идея создать инструмент, который позволил бы удобно преобразовывать JSON-текст в данные без использования промежуточного DOM. Так появился ajson.
Описание:
------------------------------------------------------------------
struct Person {
std::string Name;
int Age;
};
AJSON(Person, Name, Age);
Person obj;
char * json = "{ \"Name\" : \"Boo\", \"Age\" : 28}";
ajson::load_from_buff(obj, json);
Этот код показывает, что такое ajson и как он работает. Ajson также поддерживает последовательные контейнеры STL.
Вот более сложный пример:
enum PhoneType {
MOBILE = 0,
HOME = 1,
WORK = 2
};
struct PhoneNumber {
std::string number;
PhoneType type = MOBILE;
PhoneNumber(std::string const& number_ = "", PhoneType type_ = MOBILE)
:number(number_), type(type_) {}
};
struct Person {
std::string name;
int32_t id;
std::string mail;
std::vector<PhoneNumber> phones;
Person(std::string name_ = "", int32_t id_ = 0, std::string mail_ = "")
:name(name_), id(id_), mail(mail_) {}
};
struct AddressBook {
std::vector<Person> peoples;
};
AJSON(PhoneNumber, number, type);
AJSON(Person, name, id, mail, phones);
AJSON(AddressBook, peoples);
Ajson поддерживает вложенные структуры и контейнеры STL.
Особенности:
При десериализации ajson сканирует данные и сразу помещает их в соответствующие поля структуры. Это позволяет избежать использования временного DOM и уменьшает объём работы и использование памяти, что повышает производительность.
Использование ajson просто: достаточно определить соответствующий макрос AJSON.
Зависимости ajson минимальны: он использует только один заголовочный файл, что упрощает процесс компиляции.
Важные моменты:
Если JSON содержит escape-символы, ajson изменяет исходный текст, чтобы избежать выделения новой памяти. Если вы не хотите изменять исходный текст, создайте его копию.
Поскольку ajson работает только с памятью, операции с файлами могут потребовать большого объёма памяти, поэтому он не подходит для обработки больших файлов.
Почему выбран JSON вместо XML?
JSON лучше соответствует описанию данных в C++. Например, в XML есть узлы и атрибуты, которые могут быть сопоставлены с членами структуры в C++. Возникает вопрос, какой тип данных использовать для каждого члена структуры — узел или атрибут.
Другие изменения:
Ajson полностью бесплатен и не имеет ограничений. Он использует систему лицензирования Boost.
Версия 0.2.2: изменена стратегия модификации памяти. Старый способ объявлен в файле ajson_msd.hpp. Пользователи, привыкшие к старому способу, могут продолжать его использовать. Новый способ может немного снизить производительность, но снимает ограничения на использование.
Версия 0.2.1: удалена v-синтаксис из макросов. Благодаря предложению пользователя 奏之章. Обратите внимание, что после этого изменения ajson нельзя использовать с классами, помеченными как final.
Версия 0.2.0: по сравнению с версией 0.1.x, ajson не получил новых функций. Основное изменение заключается в том, что зависимость от rapidjson и boost была удалена, и теперь ajson является полностью независимым.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )