QT中json与数据转换

2023-11-16

一、json简介

json是以键值对形式存储数据信息的文本格式,key是字符串,value可以使基础数据类型、数组、对象等;主要应用于前后端的数据传输、项目配置文件;轻量级的文本格式相比于xml更加简洁,但是缺陷是不能有注释。

二、json文件的写入与解析

1、简单的json对象

需要写入如下的简单的json对象:

{
    "Cross Platform": true,
    "From": 1991,
    "Name": "Qt"
}

写入:

// 构建 JSON 对象
QJsonObject json;
json.insert("Name", "Qt");
json.insert("From", 1991);
json.insert("Cross Platform", true);

// 构建 JSON 文档
QJsonDocument document;
document.setObject(json);
QByteArray byteArray = document.toJson(QJsonDocument::Compact);
QString strJson(byteArray);

qDebug() << strJson;

解析:

QJsonParseError jsonError;
QJsonDocument doucment = QJsonDocument::fromJson(byteArray, &jsonError);  // 转化为 JSON 文档
if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError)) {  // 解析未发生错误
    if (doucment.isObject()) { // JSON 文档为对象
        QJsonObject object = doucment.object();  // 转化为对象
        if (object.contains("Name")) {  // 包含指定的 key
            QJsonValue value = object.value("Name");  // 获取指定 key 对应的 value
            if (value.isString()) {  // 判断 value 是否为字符串
                QString strName = value.toString();  // 将 value 转化为字符串
                qDebug() << "Name : " << strName;
            }
        }
        if (object.contains("From")) {
            QJsonValue value = object.value("From");
            if (value.isDouble()) {
                int nFrom = value.toVariant().toInt();
                qDebug() << "From : " << nFrom;
            }
        }
        if (object.contains("Cross Platform")) {
            QJsonValue value = object.value("Cross Platform");
            if (value.isBool()) {
                bool bCrossPlatform = value.toBool();
                qDebug() << "CrossPlatform : " << bCrossPlatform;
            }
        }
    }
}

2、json数组

构建如下数组:

[
    "Qt",
    5.7,
    true
]

写入:

// 构建 JSON 数组
QJsonArray json;
json.append("Qt");
json.append(5.7);
json.append(true);

// 构建 JSON 文档
QJsonDocument document;
document.setArray(json);
QByteArray byteArray = document.toJson(QJsonDocument::Compact);
QString strJson(byteArray);

qDebug() << strJson;

解析:

QJsonParseError jsonError;
QJsonDocument doucment = QJsonDocument::fromJson(byteArray, &jsonError);  // 转化为 JSON 文档
if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError)) { // 解析未发生错误
    if (doucment.isArray()) { // JSON 文档为数组
        QJsonArray array = doucment.array();  // 转化为数组
        int nSize = array.size();  // 获取数组大小
        for (int i = 0; i < nSize; ++i) {  // 遍历数组
            QJsonValue value = array.at(i);
            if (value.type() == QJsonValue::String) {
                QString strName = value.toString();
                qDebug() << strName;
            }
            if (value.type() == QJsonValue::Double) {
                double dVersion = value.toDouble();
                qDebug() << dVersion;
            }
            if (value.type() == QJsonValue::Bool) {
                bool bCrossPlatform  = value.toBool();
                qDebug() << bCrossPlatform;
            }
        }
    }
}

3、复杂的json对象

构建如下复杂的数据结构:

{
    "Company": "Digia",
    "From": 1991,
    "Name": "Qt",
    "Page": {
        "Developers": "https://www.qt.io/developers/",
        "Download": "https://www.qt.io/download/",
        "Home": "https://www.qt.io/"
    },
    "Version": [
        4.8,
        5.2,
        5.7
    ]
}

写入:

// 构建 Json 数组 - Version
QJsonArray versionArray;
versionArray.append(4.8);
versionArray.append(5.2);
versionArray.append(5.7);

// 构建 Json 对象 - Page
QJsonObject pageObject;
pageObject.insert("Home", "https://www.qt.io/");
pageObject.insert("Download", "https://www.qt.io/download/");
pageObject.insert("Developers", "https://www.qt.io/developers/");

// 构建 Json 对象
QJsonObject json;
json.insert("Name", "Qt");
json.insert("Company", "Digia");
json.insert("From", 1991);
json.insert("Version", QJsonValue(versionArray));
json.insert("Page", QJsonValue(pageObject));

// 构建 Json 文档
QJsonDocument document;
document.setObject(json);
QByteArray byteArray = document.toJson(QJsonDocument::Compact);
QString strJson(byteArray);

qDebug() << strJson;

解析:

QJsonParseError jsonError;
QJsonDocument doucment = QJsonDocument::fromJson(byteArray, &jsonError);  // 转化为 JSON 文档
if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError)) {  // 解析未发生错误
    if (doucment.isObject()) {  // JSON 文档为对象
        QJsonObject object = doucment.object();  // 转化为对象
        if (object.contains("Name")) {
            QJsonValue value = object.value("Name");
            if (value.isString()) {
                QString strName = value.toString();
                qDebug() << "Name : " << strName;
            }
        }
        if (object.contains("Company")) {
            QJsonValue value = object.value("Company");
            if (value.isString()) {
                QString strCompany = value.toString();
                qDebug() << "Company : " << strCompany;
            }
        }
        if (object.contains("From")) {
            QJsonValue value = object.value("From");
            if (value.isDouble()) {
                int nFrom = value.toVariant().toInt();
                qDebug() << "From : " << nFrom;
            }
        }
        if (object.contains("Version")) {
            QJsonValue value = object.value("Version");
            if (value.isArray()) {  // Version 的 value 是数组
                QJsonArray array = value.toArray();
                int nSize = array.size();
                for (int i = 0; i < nSize; ++i) {
                    QJsonValue value = array.at(i);
                    if (value.isDouble()) {
                        double dVersion = value.toDouble();
                        qDebug() << "Version : " << dVersion;
                    }
                }
            }
        }
        if (object.contains("Page")) {
            QJsonValue value = object.value("Page");
            if (value.isObject()) {  // Page 的 value 是对象
                QJsonObject obj = value.toObject();
                if (obj.contains("Home")) {
                    QJsonValue value = obj.value("Home");
                    if (value.isString()) {
                        QString strHome = value.toString();
                        qDebug() << "Home : " << strHome;
                    }
                }
                if (obj.contains("Download")) {
                    QJsonValue value = obj.value("Download");
                    if (value.isString()) {
                        QString strDownload = value.toString();
                        qDebug() << "Download : " << strDownload;
                    }
                }
                if (obj.contains("Developers")) {
                    QJsonValue value = obj.value("Developers");
                    if (value.isString()) {
                        QString strDevelopers = value.toString();
                        qDebug() << "Developers : " << strDevelopers;
                    }
                }
            }
        }
    }
}

三、QT中配置文件应用json实现

1、需求

工程模块需要实现新建工程、打开工程、保存工程三大功能:
在这里插入图片描述

2、打开工程

void MasterWindow::openEnginSlot()
{
	QMessageBox* msg = new QMessageBox(QMessageBox::Question, tr("请选择"), tr("是否保存当前工程?"), QMessageBox::Yes | QMessageBox::No);
	msg->button(QMessageBox::Yes)->setText("保存");
	msg->button(QMessageBox::No)->setText("不保存");
	msg->setWindowIcon(QIcon(":Image/winIcon2.ico"));
	int ret = msg->exec();
	if (ret == QMessageBox::Yes)
	{
		saveEnginSlot();
	}

	QFileDialog* fileDialog = new QFileDialog(this);
	fileDialog->setWindowTitle(tr("打开工程"));
	QIcon icon(QStringLiteral(":/Image/winIcon2.ico"));
	fileDialog->setWindowIcon(icon);
	fileDialog->setDirectory("/");
	fileDialog->setNameFilter(tr("text(*.json)"));
	fileDialog->setFileMode(QFileDialog::ExistingFiles);
	fileDialog->setViewMode(QFileDialog::Detail);
	QStringList fileNames;
	if (fileDialog->exec())
	{
		fileNames = fileDialog->selectedFiles();
	}
	if (fileNames.length() > 0) {
		QString project_path = fileNames[0];
		QDir dir(project_path);
		if (_projectPath == project_path)
		{
			return;
		}
		_projectPath = project_path;
		QFile file(_projectPath);
		QFileInfo info(file);
		QString filenameNoSuff = info.baseName();
		ui->labelEngin->setText(filenameNoSuff);

		QFile file_r(_projectPath);
		if (file_r.open(QIODevice::ReadOnly | QIODevice::Text))
		{
			QString jsonfile = file_r.readAll();
			file_r.close();

			QJsonParseError jsonParseError;
			QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonfile.toUtf8(), &jsonParseError);
			if (!(jsonParseError.error == QJsonParseError::NoError))
			{
				QMessageBox::about(NULL, "提示", "项目配置文件错误");
				return;
			}

			QJsonObject jsonObj = jsonDoc.object();
			_materialPathList.clear();
			_playingMaterialPathList.clear();
			_playingMaterialInfoList.clear();
			for (int i = 0; i < jsonObj["materialNum"].toInt(); i++)
			{
				_materialPathList.push_front(jsonObj["material" + QString::number(i)].toString());
			}
			if (jsonObj.contains("playingMaterialPathArray")) 
			{
				QJsonValue value = jsonObj.value("playingMaterialPathArray");
				if (value.isArray()) { 
					QJsonArray array = value.toArray();
					int nSize = array.size();
					for (int i = 0; i < nSize; ++i) {
						QJsonValue value = array.at(i);
						if (value.isString()) {
							_playingMaterialPathList.push_front(value.toString());
						}
					}
				}
			}
			if (jsonObj.contains("playingMaterialInfoArray"))
			{
				QJsonValue value = jsonObj.value("playingMaterialInfoArray");
				if (value.isArray()) { 
					QJsonArray array = value.toArray();
					int nSize = array.size();
					for (int i = 0; i < nSize; ++i) {
						QJsonValue value = array.at(i);
						if (value.isObject()) {
							QJsonObject jsonObj = value.toObject();
							int isize = jsonObj.size();
							materialInfo *info = new materialInfo;
							for (int i = 0; i < isize; i++)
							{
								QFileInfo fileInfo(jsonObj["path"].toString());
								
								info->materialName = fileInfo.fileName();
								info->path = jsonObj["path"].toString();
								info->xPoint = jsonObj["xPoint"].toInt();
								info->yPoint = jsonObj["yPoint"].toInt();
								info->width = jsonObj["width"].toInt();
								info->heigh = jsonObj["heigh"].toInt();
								
							}
							_playingMaterialInfoList.push_front(info);
						}
					}
				}
			}
			emit initPlayList();
			emit initMaterialSignal(_materialPathList);
			emit initViewFormSignal(_playingMaterialPathList, _playingMaterialInfoList);
			}
		else {
			file_r.close();
		}

	}
}

3、保存工程

void MasterWindow::saveEnginSlot()
{
	//判断_projectPath是否为空,如果为空,说明是读取临时工程。否则读取系统文件中保存的上次打开的工程
	if (_projectPath == "") {
		EnginSet* enginSet = new EnginSet();
		enginSet->setWindowModality(Qt::ApplicationModal);
		enginSet->setWindowTitle("项目");
		enginSet->setEnginMode("保存工程");
		enginSet->setWindowIcon(QIcon(":/Image/winIcon2.ico"));
		enginSet->show();
		connect(enginSet, &EnginSet::savePathSignal, this, [this](QString path) {
			_projectPath = path;
			qDebug() << "保存工程的路径生成了" << _projectPath;
			QFile file(_projectPath);
			QFileInfo info(file);
			QString filenameNoSuff = info.baseName();
			ui->labelEngin->setText(filenameNoSuff);
			//以读写方式打开临时工程文件
			if (file.open(QIODevice::ReadWrite))
			{
				QJsonDocument jsonDoc;
				QJsonObject jsonObj;
				QJsonArray playingMaterialPathArray;
				QJsonArray playingMaterialInfoArray;

				QString mat="material";
				jsonObj.insert("path", _projectPath);
				if (_materialPathList.count() != 0)
				{
					int i = 0;
					for (; i < _materialPathList.count(); i++)
					{
						jsonObj.insert(mat+QString::number(i), _materialPathList[i]);
					}
					jsonObj.insert("materialNum",i);
				}
				if (_playingMaterialPathList.count() != 0)
				{
					int i = 0;
					for (; i < _playingMaterialPathList.count(); i++)
					{
						playingMaterialPathArray.append(_playingMaterialPathList[i]);
					}
					jsonObj.insert("playingMaterialPathArray", QJsonValue(playingMaterialPathArray));
				}
				if (_playingMaterialInfoList.count() != 0)
				{
					int i = 0;
					for (; i < _playingMaterialInfoList.count(); i++)
					{
						QJsonObject jsonObj1;
						jsonObj1.insert("materialName", _playingMaterialInfoList[i]->materialName);
						jsonObj1.insert("path", _playingMaterialInfoList[i]->path);
						jsonObj1.insert("xPoint", _playingMaterialInfoList[i]->xPoint);
						jsonObj1.insert("yPoint", _playingMaterialInfoList[i]->yPoint);
						jsonObj1.insert("width", _playingMaterialInfoList[i]->width);
						jsonObj1.insert("heigh", _playingMaterialInfoList[i]->heigh);
						playingMaterialInfoArray.append(jsonObj1);
					}
					jsonObj.insert("playingMaterialInfoArray", QJsonValue(playingMaterialInfoArray));
				}
				jsonDoc.setObject(jsonObj);
				file.resize(0);
				//写入json文件
				file.write(jsonDoc.toJson());
				file.close();
				qDebug() << _projectPath + "open ok";
			}
			else {
				qDebug() << _projectPath + " open error!";
				file.close();
			}
			QMessageBox::about(NULL, "提示", "项目保存成功");
			});
	}
	else
	{
		qDebug() << "G_Project_path不为空";
		QFile file(_projectPath);
		if (file.open(QIODevice::ReadWrite | QIODevice::Text))
		{
			QJsonDocument jsonDoc;
			QJsonObject jsonObj;
			QJsonArray playingMaterialPathArray;
			QJsonArray playingMaterialInfoArray;
			jsonDoc.setObject(jsonObj);
			file.resize(0);//清空文件
			file.write(jsonDoc.toJson());
			file.close();
			qDebug() << _projectPath + "open ok";
			QString mat = "material";
			//改变系统配置json文件的项目路径
			QFile sys_file(_projectPath);
			sys_file.open(QIODevice::ReadWrite);

			QString jsonfile = sys_file.readAll();

			QJsonParseError jsonParseError;
			QJsonDocument sys_doc = QJsonDocument::fromJson(jsonfile.toUtf8(), &jsonParseError);
			if (!(jsonParseError.error == QJsonParseError::NoError))
			{
				QMessageBox::about(NULL, "提示", "系统配置文件错误");
				return;
			}
			QJsonObject sys_json = sys_doc.object();
			sys_json["path"] = _projectPath;
			if (_materialPathList.count() != 0)
			{
				int i = 0;
				for (; i < _materialPathList.count(); i++)
				{
					sys_json.insert(mat + QString::number(i), _materialPathList[i]);
				}
				sys_json.insert("materialNum", i);
			}
			if (_playingMaterialPathList.count() != 0)
			{
				int i = 0;
				for (; i < _playingMaterialPathList.count(); i++)
				{
					playingMaterialPathArray.append(_playingMaterialPathList[i]);
				}
				sys_json.insert("playingMaterialPathArray", QJsonValue(playingMaterialPathArray));
			}
			if (_playingMaterialInfoList.count() != 0)
			{
				int i = 0;
				for (; i < _playingMaterialInfoList.count(); i++)
				{
					QJsonObject jsonObj1;
					jsonObj1.insert("materialName", _playingMaterialInfoList[i]->materialName);
					jsonObj1.insert("path", _playingMaterialInfoList[i]->path);
					jsonObj1.insert("xPoint", _playingMaterialInfoList[i]->xPoint);
					jsonObj1.insert("yPoint", _playingMaterialInfoList[i]->yPoint);
					jsonObj1.insert("width", _playingMaterialInfoList[i]->width);
					jsonObj1.insert("heigh", _playingMaterialInfoList[i]->heigh);
					playingMaterialInfoArray.append(jsonObj1);
				}
				sys_json.insert("playingMaterialInfoArray", QJsonValue(playingMaterialInfoArray));
			}
			sys_doc.setObject(sys_json);
			sys_file.resize(0);//清空文件
			sys_file.write(sys_doc.toJson());

			sys_file.close();
			
			qDebug() << "系统配置json文件的项目路径更改成功";
		}
		else
		{
			file.close();
			qDebug() << _projectPath + " open error!";
		}
		QMessageBox::about(NULL, "提示", "项目保存成功");
	}
}

4、新建工程

void MasterWindow::newEnginSlot()
{
	QMessageBox* msg = new QMessageBox(QMessageBox::Question, "提示", "是否保存当前工程?", QMessageBox::Yes | QMessageBox::No);
	msg->setWindowIcon(QIcon(":Image/winIcon2.ico"));
	msg->button(QMessageBox::Yes)->setText("保存");
	msg->button(QMessageBox::No)->setText("不保存");
	int ret = msg->exec();
	if (ret == QMessageBox::Yes)
	{
		saveEnginSlot();
	}
	EnginSet* enginSet = new EnginSet();
	enginSet->setWindowTitle("项目");
	enginSet->setWindowModality(Qt::ApplicationModal);
	enginSet->setEnginMode("新建工程");
	enginSet->setWindowIcon(QIcon(":/Image/winIcon2.ico"));
	enginSet->show();
	connect(enginSet, &EnginSet::savePathSignal, this, [this](QString path) {
		_projectPath = path;
		QFile file(_projectPath);
		QFileInfo info(file);
		QString filenameNoSuff = info.baseName();
		ui->labelEngin->setText(filenameNoSuff);
		_materialPathList.clear();
		_playingMaterialPathList.clear();
		_playingMaterialInfoList.clear();
		emit initPlayList();
		emit initMaterialSignal(_materialPathList);
		emit initViewFormSignal(_playingMaterialPathList, _playingMaterialInfoList);
		saveEnginSlot();
		});
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT中json与数据转换 的相关文章

随机推荐

  • 20230918使用ffmpeg将mka的音频转为AAC编码以便PR2023来识别

    20230918使用ffmpeg将mka的音频转为AAC编码以便PR2023来识别 2023 9 18 20 58 ffmpeg i 1 mka acodec aac 1 mp4 ffmpeg i 1 mka vn c a aac 2 aa
  • MYSQL  Replication  主从配置

    MYSQL Replication 主从配置 MySQL Replication 又叫做AB复制或者主从复制 它主要用于MySQL的实时备份或者读写分离 在配置之前先做一下准备工作 配置两台mysql服务器 或者在一台服务器上配置两个端口也
  • IAR for AVR中的位定义使用

    目的 打开IAR for AVR中的位定义 在单片机的编程中 经常会遇到 UCSRB 1 lt lt TXEN 这样的表达式 查看定义可以在头文件中看到 define TXEN 3 表示的是 1 lt lt TXEN 是将1左移3位 然后赋
  • 使用 pandas 导出数据

    import pandas as pd In 58 df pd DataFrame houselist In 59 df In 61 df to csv lianjia 转载于 https www cnblogs com polly lin
  • 字符串 反转

    LC 反转字符串 swift 实现 var s Character h e l l o reversString s print s func reversString s inout Character var temp Characte
  • SQLServer 数据 迁移转到Mysql 中

    目录 一 SQLServer 转Mysql 的几种方法 二 DB2DB 使用 2 1 迁移出错后的报错日志 三 补齐出现问题的表 问题 原因 解决 一 SQLServer 转Mysql 的几种方法 sqlServer 转mysql 最大的问
  • vue3(二)配置标题和服务代理

    这里的标题如何改成自己的标题 第一步 修改vue config js transpileDependencies true chainWebpack config gt config plugin html tap args gt args
  • android广播数据大小限制,android 限制广播消息的接收者

    原文 http blog csdn net mingli198611 article details 17762149 在android系统中sendBroadcast和BroadcastReceiver 只要BroadcastReceiv
  • Linux学习(未完待续。。。)

    安装好ubuntu 并且注册用户成功后 给root设置密码 sudo passwd root 先输入自己的密码 然后输入root的密码 再确认 密码都是不可见的 不是键盘坏了 显示日期格式 date Y m d H M S m month
  • Hyperledger Fabric学习笔记——7.链码安装、实例化、执行

    1 智能合约 执行环境 以太坊虚拟智能合约执行环境EVM fabric执行环境是docker 链码 是应用层和区块链底层的中间点 每一个链码执行环境是一个独立的docker 使用GRPC协议与背书节点通信 只有背书节点才能运行智能合约 链码
  • 如何配置服务器自动监控并报警

    作者 一个懂技术的运营 链接 https www zhihu com question 21073555 answer 106131463 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 如果是初创型公司 机
  • Vue 的forEach和push

    tagTacticsFilter tacticsTag let data let tacticsTagList this tacticsTagList let attrList tacticsTag split attrList forEa
  • 真正的学懂三极管入门篇(经典)

    不要让温床称为埋葬你的坟墓 要有危机意识 忧患意识 要为明天考虑 禁忌 安于现状 不求上进 不懂得学习 不能恰当的处理工作和学习关系 没有把英语放在第一位
  • uniApp中 nvue和vue开发 小结

    最近接手uniapp开发 对遇到的问题进行总结 什么是nvue nvue native vue 原生渲染 为何要用nvue开发 weex 有个很大的问题是它只是一个高性能的渲染器 没有足够的API能力 比如各种push sdk集成 蓝牙等能
  • 电梯调度算法-C++

    1 算法解析 扫描算法 SCAN 又称电梯调度算法 SCAN算法是磁头前进方向上的最短查找时间优先算法 它排除了磁头在盘面局部位置上的往复移动 SCAN算法在很大程度上消除了SSTF算法的不公平性 但仍有利于对中间磁道的请求 电梯调度算法是
  • 【图解】ThreadLocal底层实现原理

    1 ThreadLocal的底层原理图 说明 Thread中有threadLocals成员变量 threadLocal会在threadlocal首次set时进行赋值 这会在非main线程中复现 主线程启动即会进行赋值 ThreadLocal
  • git使用(由浅到深)

    目录流程图 1 分布式版本控制与集中式版本控制 1 1 集中式版本控制 集中式版本控制系统有 CVS和SVN 它们的主要特点是单一的集中管理的服务器 保存所有文件的修订版本 协同开发人员通过客户端连接到这台服务器 取出最新的文件或者提交更新
  • Java面试题及答案整理(2021最新版)

    Java面试题及答案整理 一 Java 基础 1 JDK 和 JRE 有什么区别 2 和 equals 的区别是什么 3 两个对象的 hashCode 相同 则 equals 也一定为 true 对吗 4 final 在 java 中有什么
  • C语言中C89与C99的区别

    1 增加restrict指针 C99中增加了公适用于指针的restrict类型修饰符 它是初始访问指针所指对象的惟一途径 因此只 有借助restrict指针表达式才能访问对象 restrict指针指针主要用做函数变元 或者指向由malloc
  • QT中json与数据转换

    QT中json与数据转换 一 json简介 二 json文件的写入与解析 1 简单的json对象 2 json数组 3 复杂的json对象 三 QT中配置文件应用json实现 1 需求 2 打开工程 3 保存工程 4 新建工程 一 json