• 读取QJsonObject的封装[c++][Qt]


    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. class MyJsonParser {
    9. public:
    10. MyJsonParser() {}
    11. MyJsonParser(const QJsonValue& jsonValue, const QString& fieldName = "") {
    12. parseJsonValue(jsonValue, myStruct, fieldName);
    13. }
    14. MyJsonParser getNext(const QString& key) const {
    15. MyJsonParser newParser;
    16. newParser.myStruct = findStruct(key, myStruct);
    17. return newParser;
    18. }
    19. QString getValueOrFieldName() const {
    20. if (!fieldName.isEmpty()) {
    21. return fieldName;
    22. } else if (!myStruct.subMap.isEmpty()) {
    23. // 返回子字段名
    24. return myStruct.subMap.keys().first();
    25. } else if (!myStruct.arrayValues.isEmpty()) {
    26. // 表示这是一个数组
    27. return "0";
    28. } else {
    29. return myStruct.value;
    30. }
    31. }
    32. private:
    33. struct MyStruct {
    34. QMap subMap;
    35. QString value;
    36. QVector arrayValues;
    37. };
    38. MyStruct myStruct;
    39. QString fieldName;
    40. void parseJsonValue(const QJsonValue& jsonValue, MyStruct& currentStruct, const QString& fieldName) {
    41. if (jsonValue.isObject()) {
    42. const QJsonObject jsonObj = jsonValue.toObject();
    43. parseJsonObject(jsonObj, currentStruct, fieldName);
    44. } else if (jsonValue.isArray()) {
    45. const QJsonArray jsonArray = jsonValue.toArray();
    46. parseJsonArray(jsonArray, currentStruct, fieldName);
    47. } else {
    48. currentStruct.value = jsonValue.toString();
    49. this->fieldName = fieldName;
    50. }
    51. }
    52. void parseJsonObject(const QJsonObject& jsonObj, MyStruct& currentStruct, const QString& fieldName) {
    53. Q_UNUSED(fieldName);
    54. for (auto it = jsonObj.begin(); it != jsonObj.end(); ++it) {
    55. QString key = it.key();
    56. QJsonValue value = it.value();
    57. parseJsonValue(value, currentStruct.subMap[key], key);
    58. }
    59. }
    60. void parseJsonArray(const QJsonArray& jsonArray, MyStruct& currentStruct, const QString& fieldName) {
    61. for (const QJsonValue& value : jsonArray) {
    62. MyStruct arrayElement;
    63. parseJsonValue(value, arrayElement, fieldName);
    64. currentStruct.arrayValues.append(arrayElement);
    65. }
    66. }
    67. MyStruct findStruct(const QString& key, const MyStruct& currentStruct) const {
    68. QStringList keys = key.split('.');
    69. const MyStruct* structPtr = ¤tStruct;
    70. for (const QString& k : keys) {
    71. if (k.toInt() >= 0 && k.toInt() < structPtr->arrayValues.size()) {
    72. structPtr = &structPtr->arrayValues[k.toInt()];
    73. } else {
    74. auto it = structPtr->subMap.find(k);
    75. if (it == structPtr->subMap.end()) {
    76. return MyStruct(); // Key not found
    77. }
    78. structPtr = &it.value();
    79. }
    80. }
    81. return *structPtr;
    82. }
    83. };
    84. int main(int argc, char** argv) {
    85. Q_UNUSED(argc);
    86. Q_UNUSED(argv);
    87. // 假设你有包含数组的JSON数据
    88. QString jsonString = R"({
    89. "a": {
    90. "b": {
    91. "c": [
    92. {"d": "Hello"},
    93. {"d": "World"}
    94. ]
    95. },
    96. "e": "TalkIsCheap",
    97. "f": "ShowMeTheCode"
    98. },
    99. "g": []
    100. })";
    101. QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonString.toUtf8());
    102. QJsonObject jsonObj = jsonDoc.object();
    103. // 使用解析器
    104. MyJsonParser parser(jsonObj);
    105. // 链式调用获取下一个层级信息的示例
    106. QString nextInfo = parser.getNext("a.e").getValueOrFieldName(); // 返回子字段名或值
    107. QString nextInfo1 = parser.getNext("a.f").getValueOrFieldName(); // 返回子字段名或值
    108. QString nextInfoArr = parser.getNext("a.b.c").getValueOrFieldName(); // 返回"0"表示一个数组
    109. QString nextInfo2 = parser.getNext("a.b.c").getNext("0.d").getValueOrFieldName(); // 返回数组0下标的字段d的值
    110. QString nextInfo3 = parser.getNext("a.b.c").getNext("1.d").getValueOrFieldName(); // 返回数组1下标的字段d的值
    111. QString nextInfoErr = parser.getNext("a.g").getValueOrFieldName(); // 不存在字段返回""
    112. QString nextInfoErr1 = parser.getNext("a.h").getValueOrFieldName(); // 不存在字段返回""
    113. // 打印结果
    114. qDebug() << "Next Info at a.e:" << nextInfo;
    115. qDebug() << "Next Info at a.f:" << nextInfo1;
    116. qDebug() << "Next Info at a.b.c:" << nextInfoArr;
    117. qDebug() << "Next Info at a.b.c.0.d:" << nextInfo2;
    118. qDebug() << "Next Info at a.b.c.1.d:" << nextInfo3;
    119. qDebug() << "Next Info at a.g:" << nextInfoErr;
    120. qDebug() << "Next Info at a.h:" << nextInfoErr1;
    121. return 0;
    122. }

  • 相关阅读:
    程序是如何运行的?
    python趣味编程-恐龙克隆游戏
    卸载vs方法
    六大维度全面焕新升级!麒麟信安服务器操作系统V3.6.1引领未来计算
    YashanDB V23.2 LTS发版 | 共享集群首个长期支持版本
    百趣代谢组学文献分享:代谢组学中复溶溶剂究竟如何选?
    Git实战技巧-如何将暂存区的多个功能代码分成多次提交
    36.6K star!Immich - 一款开源高性能的自托管照片和视频备份方案
    Consul CA has not finished initializing
    笔记 vue3如何引入iconfont
  • 原文地址:https://blog.csdn.net/wo871427008/article/details/134323484