Qt QJson解析数组
中国好公民st 人气:0前言
现在有这样一个json结构,需要使用QJson来解析,结构如下:
"code": "0001", "descrip": "文本描述1详细描述", "id": "1", "title": "文本1标题", "type": 0, "paths": ["E:/3.json", "F:/11.txt"] }, { "code": "0002", "descrip": "文本描述2详细描述", "id": "2", "title": "文本2标题", "type": 0, "paths": ["E:/AndroidSetting.png", "E:/build.png", "F:/C++工程.png", "F:/build完成.png"] }, { "code": "00040003", "descrip": "文本", "id": "3", "title": "文本3标题", "type": 0, "paths": ["F:/native-lib文件分析.png", "F:/编辑工程.png"] }]
直接是一组json数组,连个关键字也没有,这样的数据该如何解析呢?
假设这些数据是存储在std::string串中,那么对以上字符串进行解析~
第一步:进行数据转换
将字符串解析成QJson识别的格式,第一步少不了QJsonDocument::fromJson
函数的转换,在QJsonDocument类中,该函数的定义如下:
static QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error = nullptr);
参数是QByteArray类型。
第一步要做的工作就是如何将std::string转成QByteArray类型?
QString qsJson = QString::fromLocal8Bit(sJson.c_str()); QByteArray qsArray = qsJson.toUtf8().data();
在这里,需要注意的是,QString转成QByteArray时,一定是使用toUtf8
而不是toLocal8Bit
,否则在将字符串解析成QJsonDocument时,无法解析成功!
第二步:将字符串转成QJsonDocument格式
QJsonParseError stError; QJsonDocument jsonDoc = QJsonDocument::fromJson(qsJson.toUtf8().data(), &stError); if (stError.error != QJsonParseError::NoError) { QString qsError = stError.errorString(); } if (jsonDoc.isNull()) { return false; //json结构解析失败 }
代码讲解:
为了防止在解析中出现错误而不知道是哪种原因时,就用到了QJsonParseError
类,一旦发现字符串解析失败,就可以获取错误原因,方便我们在程序开发时进行查找。
第三步:解析json数据
首先,将QJsonDocument转成QJsonArray结构
QJsonArray jsArrays = jsonDoc.array();
其次,遍历数据。与普通的STL的遍历方式一致,采用for循环方式,拿去下标下对应的数据
for(int i = 0; i < jsArrays.count(); i++) { QJsonValue valueArrayObject = jsArrays.at(i); if (valueArrayObject.type() != QJsonValue::Object) { continue; } QJsonObject jsArrayValue = valueArrayObject.toObject(); QJsonValue jsCode = jsArrayValue.value("code"); QString qsCode = jsCode.toString(); }
代码解析:
上述代码流程:
1:读取数组下标数据
2:判断当前第i个数据的类型是不是json类型,此时,不是,不需要后续操作
3:类型转换
4:实际的json数据解析
上述只是用"code"做示例,其它的参数也如同code参数的解析方式一致,就不再过多说明了。但是需要注意,在读取下标、判断类型、类型转换这三步骤操作一定是要做的。
对于"paths"中仅有字符串的结构,该如何解析呢?
此时,就省略了第二步、第三步操作,直接将下标对应的json结构解析就可以了
QJsonValue valuePathObject = jsUrlArray.at(m); //获取数组下标数据 QString qsPath = valuePathObject.toString();
加载全部内容