欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

QT解析json文件

程序员文章站 2024-01-12 16:22:52
...

读取文件

#include<QFile>
QString filename(“3.json”);

打开文件

先判定文件是否存在,在打开文件(是否正确打开)

if (!filename.exists()) { 
		qDebug() << "file doesnt exist";
		return -1; 
	}
if (!filename.open(QIODevice::ReadOnly)) {
		qDebug() << "some error when read the file" << endl;
		return -1;
	}

读取文件到QByteArray中

QByteArray allData = file.readAll();
关闭文件
file.close();

解析json字符串

需要包含头文件

#include <QJsonParseError>
#include <QJsonDocument>
#include <QJsonObject>

生成QJsonDocument对象:

QJsonParseError parseJsonErr;
QJsonDocument jsonDoc = QJsonDocument::fromJson(allData,&parseJsonErr);

是否解析错误:

if (!(parseJsonErr.error == QJsonParseError::NoError)){
		qDebug() << QString::fromLocal8Bit("解析json文件错误!");
		return -1;
	}

转成QJsonObject对象:

QJsonObject res=jsonDoc.object();

解析的json文件中若有数组,则添加头文件:

#include <QJsonArray>

从这个Qjson对象中取值的方式可以通过operator["对应的键"]或者成员函数QJsonObject::value("对应的键")的方式。

而得到的值是QJsonValue类型的。这个类有toString(),toArray()等方法来转换值。

例如,这样的json文件:


    {
        "color": [
            100,
            255,
            0,
            100
        ],
        "label": "mouth",
        "points": [
            [
                0.41333332657814026,
                0.5742856860160828
            ],
            [
                0.6266666650772095,
                0.5714285969734192
            ],
            [
                0.6266666650772095,
                0.5714285969734192
            ],
            [
                0.4346666634082794,
                0.5961904525756836
            ],
            [
                0.40933331847190857,
                0.5742856860160828
            ]
        ],
        "type": "Polygons"
    }


可以通过foreach的方式对QJson对象进行遍历:

for each (auto var in res){
		qDebug()<<var;
	}

结果:(上面删了一些点)
QT解析json文件
https://blog.csdn.net/dengjin20104042056/article/details/102729044
这一篇是关于QJsonValue类和其成员方法的一些介绍

具体的解析方式:

	for each (auto val in res){
		qDebug()<<val;
		if (val.isArray()) {
			QJsonArray array = val.toArray();
			for (int i = 0; i < array.size(); i++) {
				QJsonValue sonArray = array.at(i);
				if (sonArray.isArray()) {// 对于points 二维数组的数组
					qDebug() << "points:";
					QJsonArray grandsonArry = sonArray.toArray(); //二维数组,size()获取数组元素个数
					for (int j = 0; j < grandsonArry.size(); j++) {
						double str = grandsonArry.at(j).toDouble();
						qDebug() << str;
					}
				}
				else {// 对于color
					qDebug() << "color:";
					qDebug() << sonArray;
				}
				//qDebug() << sonArray;
			}
		}
	}

用了toDouble()方法将QJsonValue转成double,用toArray()转成QJsonArray。
另外还有判断的成员函数:isArray()、isDouble()等等。
结果:
QT解析json文件
QT解析json文件
刚才说的转换方法:
QT解析json文件
QT解析json文件

小结

总结下具体步骤:(QJsonValue可以通过函数QJsonValue::toObject()转换为QJsonObject对象)

  1. 先用QFile类打开*.json文件并读出所有内容到QByteArray中,用到函数QFile::open(QIODevice::ReadOnly)QByteArray QFile::readAll();

  2. 用读出的内容初始化QJsonDocument类,用到函数QJsonDocument::fromJson();

  3. QJsonDocument类的成员函数QJsonDocument::object()得到为一个具体的对象QJsonObject

  4. 通过对对象QJsonObject进行操作,可以直接获取第一级的一对:键-值。获取的值类型为QJsonValue类型,它包含判断值类型和转换值类型的成员函数。比如QJsonObject jsonObject;

QJsonvalue keyValue =  jsonObject["name"];// 或者jsonObject.value("name")

其中,keyValue的值就是json文件下对应的value值。可以通过成员函数toString()、toDouble()、toInt()等来转换值类型。

  1. 当对象QJsonObject里面是一组数组(即有符号[ ])时,需要将获取的对应键的值,转化为json数组QJsonArray,可以直接用函数QJsonObject.value()或者函数QJsonObject.take()来获取对应键的值。
QJsonValue arrayValue = jsonObject.value(QStringLiteral("recoveryPrimaryNode"));

获取对应键的值后将其复制给json数组QJsonArray,然后用函数QJsonArray::at(i)来获取该数组下的第i个元素,可以用循环for(int i=0;i<array.size();i++)来该数组。

当获取某个键对应的值后,可以通过函数QJsonValue::toObject()将该值转换为对象,然后对象就可以像一级键-值来获取对应键的值。

相关标签: QT