1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/lordoffox-ajson

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

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 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
BSL-1.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/lordoffox-ajson.git
git@api.gitlife.ru:oschina-mirror/lordoffox-ajson.git
oschina-mirror
lordoffox-ajson
lordoffox-ajson
master