Qt中读取json文件以及总结

584 阅读3分钟

「这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战

使用过C++方式解析json的掘友们一定都知道,实在是太痛苦了!用之前还需要添加各种文件,每次获取数据时,只要稍微懈怠忘记了判断是否为nullptr就有可能出现崩溃的问题,好难呀!本身C++写解析就比较麻烦,json的解析更是长篇大论,最近想尝试下Qt中自带的QJson的方式对json文件的读取,普通的读取查阅资料就有各种方式,这里主要是总结在使用过程中遇到的那些坑,让大家引以为戒~

读取json文件

首先介绍下如何进行json文件的读取,获取文件中的内容~

QFile file(qsJsonFiles);
bool bOpen = file.open(QIODevice::ReadOnly);
if (bOpen == false)
{
	return;
}
QByteArray data = file.readAll();
file.close();

与普通的*.txt文件的读取方式一致,在我们操作json文件时,其实是对QByteArray中的内容进行处理的。

使用json文件对象加载字符串

QJsonDocument doc = QJsonDocument::fromJson(data);
if (!doc.isObject())
{
	return;
}

到这里,我来讲解下遇到的第一个坑吧!

假设你的程序中只是在某一个函数中读取json数据,除此之外并没有地方用到,那么恭喜你可以写成局部变量直接使用。

但是,你想要在整个程序的不同地方对json进行解析,虽然也是在一个类中操作,但是!需要记住的是,不要多次将json文件转换成QJsonDocument

QJsonDocument:只是提供一种读取和写入json文档的方法,不是让我们来回转换的

那我们该使用什么一直获取数据呢?

QJsonObject obj = doc.object();

在这里我们想要多个函数处理json文件,比较好用的方式是存储成员变量的QJsonObject对象。

json文件转成json对象

首先,我们先看一个简单的json文件内容

{
	"first":
	{
		"describe":"文本描述",
	},
	"second":
	[{
		"describe":"数据结构",
	}],
	"three":
	[
		"纯数组1",
		"纯数组2",
	]
}

三种情况,1:纯数据,带有数据的以及纯数组方式加载

针对于不同的json结构我们是如何读取的呢?

1:first情况

QJsonObject obj = doc.object();
if (obj.contains("first") && obj["first"].isObject())
{
	QJsonObject subObj = obj["first"].toObject();
}

使用这种方式需要注意的是,"first"这个key值一定是必须存在的。

其实还有另一种设置方式,代码如下:

 QJsonValue value = obj.value("first");
 if(value.isObject())
 {
     //数据有效,进行实际处理
 }

第二种方式也只能适合普通的json数据,对于带有数组的json就不适合了。

2:second、three情况

针对于后面的两种情况可以用一种方式来获取

if (obj.contains("second") && obj["second"].isArray())
{
	QJsonArray subObjList = obj["miseCaseStageList"].toArray();
        //实际的数据处理
}

在这里我也是第一次使用QJson的方法,如果有不正确的大家可以留言提出来,咱们共同进步,哈哈!

我是中国好公民st,一名C++开发程序猿~