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

OSCHINA-MIRROR/zhoutk-zjson

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

ZJSON    Chinese version

Introduction

From Node.js back to C++. I particularly miss the pleasure of working with JSON in JavaScript, so I decided to make my own variant. I used a variety of libraries such as: rapidjson, cJson, CJsonObject, drleq cppjson, json11 and others. The data structure of Zjson was inspired by cJOSN. Part of the parsing is based on json11, thank you for that! Finally, since storing data requires not only distinguishing values but also knowing their types, I chose std::variant and std::any supported by C++17. The C++ version was set to C++17. This library is created as a single header file, independent of other libraries except the standard C++ library.

Design Concept

Simple interface functions, simple usage methods, flexible data structures, and maximum support for chaining operations. Implementation of the simplest design using template technology. Adding a child object Json requires just one function -- addSubitem, which automatically recognizes whether the value is or a child Json object. The Json object is stored in a linked list structure (inspired by cJSON). Please review my design of the data structure below. The header and subsequent nodes use the same structure, allowing chaining operations when working with data structures. ## Процесс проекта На данный момент проект завершил большую часть своих функций. Подробнее см. список задач. список задач:

  • конструктор (объект & массив)
  • конструктор (значения)
  • сериализационный конструктор JSON
  • конструктор копирования
  • конструктор initializer_list
  • деструктор
  • оператор =
  • оператор []
  • содержит
  • получить тип значения
  • получить и удалить
  • получить все ключи
  • добавить подэлемент (добавить подэлементы & быстро добавить элементы в массив)
  • преобразовать в строку (сгенерировать строку JSON)
  • преобразование в int, double, bool
  • преобразование в vector
  • является ошибкой, null, массивом
  • парсинг — из строки JSON в объект JSON
  • расширение — JSON
  • объединение — JSON
  • добавление в начало — JSON
  • добавление в конец — JSON
  • вставка — JSON
  • очистка
  • std::move
  • удаление ключа
  • удаление целого числа
  • удаление первого, последнего, первого элемента
  • удаление первого, последнего, элемента (для массива)
  • вырезание
  • взять
  • тест производительности и сравнение рекурсивной версии
  • алгоритм без рекурсии
  • повторный тест производительности и сравнение ## Структура данных

    Тип узла JSON

Для внутреннего использования тип данных используется только внутри класса Json

enum Type {
    Error,                // ошибка или некорректный Json
    False,                // тип значения Json — false
    True,                 // тип значения Json — true
    Null,                 // тип значения Json — null
    Number,               // тип значения Json — число
    String,               // тип значения Json — строка
    Object,               // тип объекта Json
    Array                 // тип массива Json
};

Определение узла Json

class Json {
    Json* brother;        // как cJSON's next
    Json* child;          // узел-потомок, для типа объекта
    Type type;            // тип узла
    std::variant<int, bool, double, std::string> data;   // данные узла
    std::string name;     // ключ узла
}

Интерфейс

Тип объекта поддерживает только объекты и массивы.

enum class JsonType
{
    Object = 6,
    Array = 7
};

Список API

  • Json(JsonType type = JsonType::Object) // конструктор по умолчанию, может создать объект или массив
  • template<typename T> Json(T value, std::string key="") // конструктор с значением
  • Json(const Json& origin) // конструктор перемещения
  • Json(Json&& rhs) // конструктор копирования
  • Json(std::string jsonStr) // конструктор десериализации
  • explicit Json(std::initializer_list<std::pair<const std::string, Json>> values) // конструктор инициализатора для объекта
  • Json& operator=(const Json& origin)
  • Json& operator=(Json&& origin)
  • Json operator[](const int& index)
  • Json operator[](const std::string& key)
  • template<typename T> bool addSubitem(T value)
  • template<typename T> bool addSubitem(std::string name, T value) // добавление подэлемента
  • std::string toString()
  • bool isError()
  • bool isNull()
  • bool isObject()
  • bool isArray()
  • bool isNumber()
  • bool isTrue()
  • bool isFalse()
  • int toInt()- float toFloat()
  • double toDouble()
  • bool toBool()
  • vector toVector()
  • bool extend(Json value)
  • bool concat(Json value) // для объекта массива
  • bool push_front(Json value) // для объекта массива
  • bool push_back(Json value) // для объекта массива
  • bool insert(int index, Json value) // для объекта массива
  • void clear() // очистка потомков
  • void remove(const string &key)
  • bool contains(const string& key)
  • string getValueType() // возвращает тип значения в виде строки
  • Json getAndRemove(const string& key)
  • std::vectorstd::string getAllKeys()## Примеры
    Json subObject{{"math", 99},{"str", "строка."}};
    Json mulitListObj{{"fkey", false},{"strkey","ffffff"},{"num2", 9.98}, {"okey", subObject}};
    Json subArray(JsonType::Array);
    subArray.add({12,13,14,15});
    Json ajson(JsonType::Object);
    std::string data = "kevin";
    ajson.add("fail", false);
    ajson.add("name", data);
    ajson.add("school-en", "школа 85.");
    ajson.add("age", 10);
    ajson.add("scores", 95.98);
    ajson.add("nullkey", nullptr);
    Json sub;
    sub.add("math", 99);
    ajson.addValueJson("subJson", sub);
    Json subArray(JsonType::Array);
    subArray.add("Я первый.");
    subArray.add("два", 2);
    Json sub2;
    sub2.add("sb2", 222);
    subArray.addValueJson("subObj", sub2);
    ajson.addValueJson("array", subArray);
    std::cout << "ajson's string is : " << ajson.toString() << std::endl;
    std::string name = ajson["name"].toString();
    int oper = ajson["sb2"].toInt();
    Json operArr = ajson["array"];
    std::string first = ajson["array"][0].toString();

Результат mulitListObj:

{
    "fkey": false,
    "strkey": "ffffff",
    "num2": 9.98,
    "okey": {
        "math": 99,
        "str": "строка."
    }
}

Результат ajson:

{
    "fail": false,
    "name": "kevin",
    "school-en": "школа 85.",
    "age": 10,
    "scores": 95.98,
    "nullkey": null,
    "subJson": {
        "math": 99
    },
    "array": [
        "Я первый.",
        2,
        {
            "sb2": 222
        }
    ]
}

Дополнительное описание см. в demo.cpp или юнит тестах в каталоге tests.

Сайт проекта

https://gitee.com/zhoutk/zjson
или
https://github.com/zhoutk/zjson

Инструкция по запуску

Проект успешно компилируется в Visual Studio 2019, GCC 7.5 и Clang 12.0.

Связанные проекты

zorm (Общее упаковывание реляционной базы данных)

https://gitee.com/zhoutk/zorm
или
https://github.com/zhoutk/zorm

Комментарии ( 0 )

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

Введение

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

Обновления

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

Участники

все

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

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