QT解析json文件

读取文件

#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;
	}

结果:(上面删了一些点)
在这里插入图片描述
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()等等。
结果:
在这里插入图片描述
在这里插入图片描述
刚才说的转换方法:
在这里插入图片描述
在这里插入图片描述

小结

总结下具体步骤:(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()将该值转换为对象,然后对象就可以像一级键-值来获取对应键的值。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值