「这是我参与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++开发程序猿~