当前位置: 首页 > news >正文

QT编程之JSON处理

一、核心类库及功能

Qt 提供了一套完整的 JSON 处理类库(位于 QtCore 模块),支持解析和生成 JSON 数据:

  • ‌QJsonDocument‌:表示完整的 JSON 文档,支持从 QJsonObject 或 QJsonArray 初始化‌。
  • ‌QJsonObject‌:用于构建和操作键值对结构的 JSON 对象,支持插入、查询、删除键值对‌。
  • ‌QJsonArray‌:处理有序值集合的 JSON 数组,可通过索引访问和修改元素‌。
  • ‌QJsonValue‌:封装 JSON 基本数据类型(字符串、数值、布尔值、空值、对象、数组)‌。
二、JSON 解析流程
  1. 读取文件数据
    使用 QFile 读取 JSON 文件并转换为 QByteArray

    QFile file("data.json");
    if (file.open(QIODevice::ReadOnly)) {
        QByteArray jsonData = file.readAll();
        file.close();
    }
  2. 解析为 JSON 文档
    通过 QJsonDocument::fromJson() 解析数据:

    QJsonDocument doc = QJsonDocument::fromJson(jsonData);
    if (doc.isNull()) {
        qDebug() << "解析失败";
        return;
    }
  3. 提取数据内容
    根据文档类型(对象或数组)获取数据:

    // 对象类型
    QJsonObject rootObj = doc.object();
    QString name = rootObj["name"].toString();
    int version = rootObj["version"].toInt();
    
    // 数组类型
    QJsonArray arr = doc.array();
    for (const QJsonValue &val : arr) {
        qDebug() << val.toString();
    }
三、JSON 数据生成方法
  1. 构建数据结构
    通过 QJsonObject 和 QJsonArray 组织数据:

    QJsonObject obj;
    obj.insert("project", "Qt Demo");
    obj.insert("version", 6.5);
    
    QJsonArray plugins;
    plugins.append("Core");
    plugins.append("GUI");
    obj.insert("plugins", plugins);
  2. 生成 JSON 文档
    将对象或数组封装为 QJsonDocument,并序列化为字符串:

    QJsonDocument doc(obj);
    QString jsonStr = doc.toJson(QJsonDocument::Compact);  // 紧凑格式
    // 或 doc.toJson(QJsonDocument::Indented);  // 带缩进的格式
四、结构体与 JSON 的转换

可通过模板或宏实现结构体与 JSON 的自动转换(需借助第三方库如 x2struct):

struct Config {
    QString host;
    int port;
    XTOSTRUCT(O(host, port));  // 声明可序列化字段
};

// 结构体转 JSON
Config cfg{"127.0.0.1", 8080};
QString json = X::tojson(cfg);  // 生成 {"host":"127.0.0.1","port":8080}

// JSON 转结构体
Config newCfg;
X::fromjson(json.toStdString(), newCfg);
五、优化与注意事项
  1. 性能优化

    • 优先使用 QJsonDocument::fromJson(),其性能在 Qt 5.15+ 中已优化‌。
    • 处理大文件时,避免频繁操作 QJsonObject 或 QJsonArray,可分批解析‌。
  2. 常见问题

    • ‌键名检查‌:严格匹配键名大小写,避免因拼写错误导致解析失败‌。
    • ‌数值精度‌:JSON 中数值类型为 double,转换整数时需显式调用 toInt()‌。
    • ‌嵌套结构‌:建议分层解析,避免深层嵌套导致代码复杂度增加‌。

相关文章:

  • 【VUE2】第五期——VueCli创建项目、Vuex多组件共享数据
  • 使用GitHub Actions实现Git推送自动部署到服务器
  • Diffie-Hellman协议简单介绍
  • Java入职篇(3)——Linux常用指令
  • Ubuntu上部署Flask+MySQL项目
  • 【C++】每日一练(链表的中间结点)
  • 蓝桥云客 挖矿
  • `gradio save_to_cache permission denied`
  • LeeCode题库第1456题
  • Linux应用:进程的回收
  • 2018年全国职业院校技能大赛高职组-计算机网络应用竞赛竞赛样题C卷
  • springboot+springai调用deepseek实现与大模型对话聊天
  • Log4j2漏洞攻略
  • H.264视频编解码:从原理到应用
  • 【日志队列】log日志实时写入队列,流式输出
  • 【Java 基础(人话版)】进制转换
  • 【区块链】以太坊
  • 什么是云原生?
  • 前端主题切换架构设计方案
  • 蓝耘携手通义万象 2.1 图生视频:开启创意无限的共享新时代
  • 试点首发进口消费品检验便利化措施,上海海关与上海商务委发文
  • 广西壮族自治区党委常委会:坚决拥护党中央对蓝天立进行审查调查的决定
  • 李成钢出席中国与《数字经济伙伴关系协定》成员部级会议
  • 李峰已任上海青浦区委常委
  • 新华时评:让医德医风建设为健康中国护航
  • 大外交|巴西总统卢拉第六次访华签署20项协议,“双方都视对方为机遇”