# qjsonutil **Repository Path**: ARG1024/qjsonutil ## Basic Information - **Project Name**: qjsonutil - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-11-20 - **Last Updated**: 2023-11-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README - datakey.h c++结构体与json/xml字符串相互转换工具类 --- ### 1. json字符串转换 json字符串: ```json { "name": "class1", "room": 1, "courses": ["math", "english", "physics", "chemistry", "biology"], "types": [0, 1, 2], "nestedValues": [ [ { "name": "math", "index": 0 }, { "name": "english", "index": 1 } ] ], "teacher": { "name": "Tony", "score": 99.9 }, "students": [ { "name": "Alice", "age": 12, "score_avg": 90.4, "adept": ["math", "english"] }, { "name": "Bob", "age": 13, "score_avg": 86.1, "adept": ["physics", "chemistry"] } ] } ``` 定义模型: ```cpp #include "include/configkey.h" using namespace QDataUtil; struct Student : DataDumpInterface { DATA_KEY(QString, name); DATA_KEY(int, age); //字段与key名称不一致时不使用宏 DataKey scoreAvg{"score_avg"}; DATA_KEY(QStringList, adept); QList prop() override { return {&name, &age, &scoreAvg, &adept}; } }; struct Teacher : DataDumpInterface { DATA_KEY(QString, name); DATA_KEY(double, score); QList prop() override { return {&name, &score}; } }; struct CourseInfo : DataDumpInterface { DATA_KEY(QString, name); DATA_KEY(int, index); QList prop() override { return { &name, &index }; } }; struct Classes : DataDumpInterface { DATA_KEY(QString, name); DATA_KEY(int, room); DATA_KEY(QStringList, courses); DATA_KEY(Teacher, teacher); DATA_KEY(QList, students); DATA_KEY(QList, types); DATA_KEY(QList>, nestedValues); QList prop() override { return {&name, &room, &courses, &teacher, &students, &types, &nestedValues}; } }; ``` 转换: ```cpp auto doc = QJsonDocument::fromJson(jsonStr); if (!doc.isNull()) { auto object = doc.object(); Classes classes; classes.fromJson(object); auto json = classes.dumpToJson(); } ``` 字符串查找 ```cpp auto room = classes.findByRouter("room"); auto teacherName = classes.findByRouter("teacher.name"); auto students = classes.findByRouter>("students"); auto aliceAge = classes.findByRouter("students.0.age"); auto aliceAdept = classes.findByRouter("students.0.adept"); auto nestedValue = classes.findByRouter("nestedValues.0.0.name"); ``` ### 2. xml字符串转换 xml字符串: ```xml class1 1 math english physics chemistry biology 0 1 2 Tony 99.9 Alice 12 90.4 math english Bob 13 86.1 physics chemistry ``` 定义模型: ```cpp #include "include/datakey.h" using namespace QDataUtil; struct TestProperty : DataDumpInterface { DATA_KEY(QString, lang); DATA_KEY(QString, type); DATA_KEY(int, value); QList prop() override { return { &lang, &type, &value }; } }; struct Student : DataDumpInterface { DATA_KEY(QString, name); DATA_KEY(int, age); //字段与key名称不一致时不使用宏 DataKey scoreAvg{"score_avg"}; DATA_KEY(QStringList, adept); QList prop() override { return {&name, &age, &scoreAvg, &adept}; } }; struct Teacher : DataDumpInterface { DATA_KEY(QString, name); DATA_KEY(double, score); QList prop() override { return {&name, &score}; } }; struct CourseInfo : DataDumpInterface { DATA_KEY(QString, name); DATA_KEY(int, index); QList prop() override { return { &name, &index }; } }; struct Classes : DataDumpInterface { DATA_KEY(QString, name); //字段属性定义 DATA_KEY(int, room, TestProperty); DATA_KEY(QStringList, courses); DATA_KEY(Teacher, teacher); //列表属性定义 DATA_KEY(QList, students, QList); DATA_KEY(QList, types); DATA_KEY(QList>, nestedValues); QList prop() override { return {&name, &room, &courses, &teacher, &students, &types, &nestedValues }; } QString groupKey() override { return "class"; } }; ``` 转换: ```cpp Classes classes; classes.fromXml(reader); QFile file("xml_buff.xml"); file.open(QIODevice::WriteOnly | QIODevice::Truncate); QXmlStreamWriter writer(&file); classes.dumpToXml(writer, true); file.close(); ``` 字符串查找 ```cpp auto room = classes.findByRouter("room"); auto teacherName = classes.findByRouter("teacher.name"); auto students = classes.findByRouter, QList>("students"); auto aliceAge = classes.findByRouter("students.0.age"); auto aliceAdept = classes.findByRouter("students.0.adept"); ```