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.
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
enum Type {
Error, // ошибка или некорректный Json
False, // тип значения Json — false
True, // тип значения Json — true
Null, // тип значения Json — null
Number, // тип значения Json — число
String, // тип значения Json — строка
Object, // тип объекта Json
Array // тип массива 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() 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 )